您的位置:首页 > 编程语言 > C语言/C++

c++链接数据库测试,中文有问题

2013-08-12 18:30 309 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
#include <Sqltypes.h>

#include "iostream"
using namespace std;

/* 检测返回代码是否为成功标志,当为成功标志返回TRUE,否则返回FALSE */
#define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO)
/* 检测返回代码是否为失败标志,当为失败标志返回TRUE,否则返回FALSE */
#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc)))

HENV henv; /* 环境句柄 */
HDBC hdbc; /* 连接句柄 */
HSTMT hsmt; /* 语句句柄 */
SQLRETURN sret; /* 返回代码 */
char szcode[6]; /* 厂商编号 */
long cbcode = 0;
char szname[21]; /* 厂商名 */
long cbname = 0;
char szasset[13]; /* 资产总值 */
long cbasset = 0;
char szaddress[11];/* 厂商地址 */
long cbaddress = 0;
void main(void)
{
	/* 申请一个环境句柄 */
	SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
	/* 设置环境句柄的ODBC版本 */
	SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
	/* 申请一个连接句柄 */
	SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
	//SQLConnect(hdbc, (SQLCHAR *)"DM4", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS);
	SQLConnect(hdbc,(SQLCHAR *)"handgame",SQL_NTS,(SQLCHAR *)"root",SQL_NTS,(SQLCHAR *)"handgame",SQL_NTS);
	/* 申请一个语句句柄 */
	SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hsmt);
	/* 立即执行查询厂商登记表的语句 */
	SQLExecDirect(hsmt, (SQLCHAR *)"SELECT nickname, charguid, exp, platformgold FROM t_char where account = 'ii21';", SQL_NTS);
	/* 绑定数据缓冲区 */
	SQLBindCol(hsmt, 1, SQL_C_CHAR, szcode, sizeof(szcode), &cbcode);
	SQLBindCol(hsmt, 2, SQL_C_CHAR, szname, sizeof(szname), &cbname);
	SQLBindCol(hsmt, 3, SQL_C_CHAR, szasset, sizeof(szasset), &cbasset);
	SQLBindCol(hsmt, 4, SQL_C_CHAR, szaddress, sizeof(szaddress), &cbaddress);
	/* 取得数据并且打印数据 */
	printf("厂商编号 厂商名 资产总值 厂商地址/n");
	for (;;) {
		sret = SQLFetchScroll(hsmt, SQL_FETCH_NEXT, 0);
		if (sret == SQL_NO_DATA_FOUND)
			break;
		printf("%s %s %s %s/n", szcode, szname, szasset, szaddress);
	}
	/* 释放语句句柄 */
	SQLFreeHandle(SQL_HANDLE_STMT, hsmt);
	/* 断开与数据源之间的连接 */
	SQLDisconnect(hdbc);
	/* 释放连接句柄 */
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	/* 释放环境句柄 */
	SQLFreeHandle(SQL_HANDLE_ENV, henv);
}


//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#pragma setlocale("chs")
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <iostream>
using namespace std;
void FetchData(SQLHSTMT hstmt)
{
SQLCHAR buffer_1[256];
SQLCHAR buffer_2[256];
SQLINTEGER status_1, status_2;
SQLBindCol(hstmt, 1, SQL_C_CHAR, buffer_1, 256, &status_1);
SQLBindCol(hstmt, 2, SQL_C_CHAR, buffer_2, 256, &status_2);
while(SQLFetch(hstmt) != SQL_NO_DATA)
{
cout<<buffer_1<<"\t\t"<<buffer_2<<endl;	
}
}

void main()
{
SQLRETURN   retcode;
SQLHENV     henv;	 //环境句柄

SQLHDBC     hdbc;	 //连接句柄
SQLHSTMT    hstmt;	 //语句句柄

//第1步
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);	//分配环境句柄
if(ODBC_SQLSUCCESS(retcode))
{
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); //设置环境属性,注册ODBC版本号
if(ODBC_SQLSUCCESS(retcode))
{
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);	//分配连接句柄
if(ODBC_SQLSUCCESS(retcode))
{
//SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, 5, 0);	//设置连接属性

retcode = SQLConnect(hdbc, (SQLCHAR*) "mysql", SQL_NTS,	//数据源名称	
(SQLCHAR*) "root", SQL_NTS,	//用户名
(SQLCHAR*) "123", SQL_NTS);//用户密码	 //连接数据源

if(ODBC_SQLSUCCESS(retcode))
{
cout<<"连接成功"<<endl;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	//分配语句句柄
if(ODBC_SQLSUCCESS(retcode))
{
retcode = SQLExecDirect(hstmt, (SQLCHAR*)"select * from str", SQL_NTS);

if(ODBC_SQLSUCCESS(retcode))
{
cout<<"SQL查询成功"<<endl;
FetchData(hstmt);

}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	//释放语句句柄
}
SQLDisconnect(hdbc);	//关闭连接
}
else
{
cout<<"连接失败"<<endl;
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);	//释放连接句柄
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);	//释放环境句柄
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: