ODBC API的一个demo

    JDBC是刚刚写过的东西,深有好感,ODBC?很久以前MFC过。
    反正是被逼的,不知道是不是版本原因,还是链接库的原因,下载下来的库都报错。于是只能自虐裸写了。
    以下只是一个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>



    使用ODBC API连接数据库需要在每一步都申请一个句柄(觉得巨恶心)。
    先声明几个handle:
    SQLHENV henv = SQL_NULL_HENV;
    SQLHDBC hdbc = SQL_NULL_HDBC;
    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);



    申请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));



    这里的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);
    不管了,直接执行SQL语句。
    SQLExecDirect(hstmt, (SQLWCHAR*)ConvertLPCSTRToLPWSTR(stmt), SQL_NTS); 
    这里的stmt就是执行的SQL语句,比如select * from user;之类。
    如果需要看返回的数据:
 
代码
  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);
    }


    SQLFetch貌似访存的函数。SQLGetData得到一个表某一列的数据。这里的1就是第一列(没有第0列貌似)。SQL_C_CHAR表示数据库 中的数据类型,用data接收,长度为256,最后一个不知道啥用的。
    所有的操作结束了,释放所有的句柄。
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);


    另外提供一个char* 转 wchar_t*的函数:
代码
 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, 0x00sizeof (WCHAR)*nOutputStrLen);
12             MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, pszOut, nInputStrLen);
13         }
14     }
15     return pszOut;
16 



   
    虽然很自虐,单起码还是能访问数据库了,;-)
    另外有看到一个比较好的reference
   

posted on 2010-02-05 02:27  vivy  阅读(413)  评论(0编辑  收藏  举报