反正是被逼的,不知道是不是版本原因,还是链接库的原因,下载下来的库都报错。于是只能自虐裸写了。
以下只是一个demo,非技术、非学术。
数据库用mysql。
第一步: 当然时候设置数据源了。 Control Panel -> System and Security -> Administrative Tools ->Data Sources (ODBC),然后Add一个数据源,假设DSN设置的是 test。
第二步:
头文件:
#include
<
windows.h
>
#include < sql.h >
#include < sqlext.h >
#include < sqltypes.h >
#include < sql.h >
#include < sqlext.h >
#include < sqltypes.h >
使用ODBC API连接数据库需要在每一步都申请一个句柄(觉得巨恶心)。
先声明几个handle:
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc
=
SQL_NULL_HDBC;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
另外需要一个 return code来接收函数的返回值,查看函数执行结果。
RETCODE retcode;
retcode
=
SQLAllocHandle (SQL_HANDLE_ENV, NULL,
&
henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
申请ODBC的handle以及连接数据库:


retcode
=
SQLAllocHandle(SQL_HANDLE_DBC, henv,
&
hdbc);
retcode = SQLConnect(hdbc,
(SQLWCHAR * ) ConvertLPCSTRToLPWSTR(dsn),
(SWORD)strlen(dsn),
(SQLWCHAR * ) ConvertLPCSTRToLPWSTR(user),
(SWORD)strlen(user),
(SQLWCHAR * ) ConvertLPCSTRToLPWSTR(password),
(SWORD)strlen(password));
retcode = SQLConnect(hdbc,
(SQLWCHAR * ) ConvertLPCSTRToLPWSTR(dsn),
(SWORD)strlen(dsn),
(SQLWCHAR * ) ConvertLPCSTRToLPWSTR(user),
(SWORD)strlen(user),
(SQLWCHAR * ) ConvertLPCSTRToLPWSTR(password),
(SWORD)strlen(password));
这里的dsn表示你自己设置的那个DSN,就是前面假设的"test",user是数据库的用户名,password是密码。注意这里有一个 ConvertLPCSTRToLPWSTR的 函数,这个是把 char* 转化成 wchar_t*,原因是不知道为什么SQLConnect被define成 SQLConnectW,里面的char的参数都变成wchar_t了,继续恶心。这个函数后面会写到。
这里我们可以查看retcode的值看是否连接成功,0或者1表示连接成功了,0被声明为 SQL_SUCCESS,1被声 明为 SQL_SUCCESS_WITH_INFO。
连接成功后可以执行SQL语句了,首先还是要申请一个句柄(fuck 句柄)。
retcode
=
SQLAllocHandle(SQL_HANDLE_STMT, hdbc,
&
hstmt);
SQLExecDirect(hstmt, (SQLWCHAR
*
)ConvertLPCSTRToLPWSTR(stmt), SQL_NTS);
如果需要看返回的数据:


while
(SQLFetch(hstmt)
==
SQL_SUCCESS)
{
char data[ 256 ];
SQLINTEGER len;
memset(data, ' \0 ' , sizeof (data));
SQLGetData(hstmt, 1 ,SQL_C_CHAR,data, 256 , & len);
printf( " %s\n " ,data);
}
{
char data[ 256 ];
SQLINTEGER len;
memset(data, ' \0 ' , sizeof (data));
SQLGetData(hstmt, 1 ,SQL_C_CHAR,data, 256 , & len);
printf( " %s\n " ,data);
}
所有的操作结束了,释放所有的句柄。
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);


1
LPWSTR ConvertLPCSTRToLPWSTR (
char
*
pCstring)
2 {
3 LPWSTR pszOut = NULL;
4 if (pCstring != NULL)
5 {
6 int nInputStrLen = strlen (pCstring);
7 int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0 , pCstring, nInputStrLen, NULL, 0 ) + 2 ;
8 pszOut = new WCHAR [nOutputStrLen];
9 if (pszOut)
10 {
11 memset (pszOut, 0x00 , sizeof (WCHAR) * nOutputStrLen);
12 MultiByteToWideChar (CP_ACP, 0 , pCstring, nInputStrLen, pszOut, nInputStrLen);
13 }
14 }
15 return pszOut;
16 }
2 {
3 LPWSTR pszOut = NULL;
4 if (pCstring != NULL)
5 {
6 int nInputStrLen = strlen (pCstring);
7 int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0 , pCstring, nInputStrLen, NULL, 0 ) + 2 ;
8 pszOut = new WCHAR [nOutputStrLen];
9 if (pszOut)
10 {
11 memset (pszOut, 0x00 , sizeof (WCHAR) * nOutputStrLen);
12 MultiByteToWideChar (CP_ACP, 0 , pCstring, nInputStrLen, pszOut, nInputStrLen);
13 }
14 }
15 return pszOut;
16 }
虽然很自虐,单起码还是能访问数据库了,;-)
另外有看到一个比较好的 reference。