ODBC API的一个demo

本文介绍了一种通过ODBC连接MySQL数据库的方法,并提供了详细的步骤和示例代码。从设置数据源到执行SQL语句,再到获取查询结果,文章涵盖了整个流程。
    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以及连接数据库:
ExpandedBlockStart.gif 代码
    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;之类。
    如果需要看返回的数据:
 
ExpandedBlockStart.gif 代码
   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*的函数:
ExpandedBlockStart.gif 代码
 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 



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

转载于:https://www.cnblogs.com/vivyli/archive/2010/02/05/1664084.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值