ODBC API的一个demo
JDBC是刚刚写过的东西,深有好感,ODBC?很久以前MFC过。
反正是被逼的,不知道是不是版本原因,还是链接库的原因,下载下来的库都报错。于是只能自虐裸写了。
以下只是一个demo,非技术、非学术。
数据库用mysql。
第一步: 当然时候设置数据源了。Control Panel -> System and Security -> Administrative Tools ->Data Sources (ODBC),然后Add一个数据源,假设DSN设置的是test。
第二步:
头文件:
使用ODBC API连接数据库需要在每一步都申请一个句柄(觉得巨恶心)。
先声明几个handle:
SQLHENV henv = SQL_NULL_HENV;
另外需要一个return code来接收函数的返回值,查看函数执行结果。
开始申请环境变量以及设置环境参数:
申请ODBC的handle以及连接数据库:
这里的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 句柄)。
不管了,直接执行SQL语句。
这里的stmt就是执行的SQL语句,比如select * from user;之类。
如果需要看返回的数据:
所有的操作结束了,释放所有的句柄。
虽然很自虐,单起码还是能访问数据库了,;-)
另外有看到一个比较好的reference。
反正是被逼的,不知道是不是版本原因,还是链接库的原因,下载下来的库都报错。于是只能自虐裸写了。
以下只是一个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。