C++中使用ODBC API访问数据库例程(转)

使用ODBC API访问数据库简单流程,供参考使用:

 ODBC API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
    SQLHENV     m_hEnviroment;               //数据库环境句柄,属于老大级别的
    SQLHDBC     m_hDatabaseConnection;       //数据库连接句柄,老大以后就是他了,有了他数据库就连接上了
    SQLHSTMT    m_hStatement;                //执行语句句柄,最终执行SQL于句的句柄

     // 使用ODBC API建立数据库连接分为3部分:
     // 申请环境句柄,
     // 使用环境句柄申请连接句柄,
     // 使用连接句柄连接数据库。

     /* 申请环境变量 */
     // 申请各种句柄都靠这个函数,
     // 参数1是要申请句柄的类型,
     // 参数2为申请该句柄依靠的句柄(老大没依靠,所以是NULL),申请结果在参数3中保存
    SQLRETURN sqlReturn = SQLAllocHandle(SQL_HANDLE_ENV,  NULL , &m_hEnviroment);
     // 返回值代表着执行的意义,如下面判断,SUCCESS_WITH_INFO相当于是警告,虽然成功了,但是可能有问题
     if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
    {
         return  - 1 ;
    }
     // 设置ODBC环境属性
    SQLSetEnvAttr(m_hEnviroment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    
     /* 申请连接句柄 */
    sqlReturn = SQLAllocHandle(SQL_HANDLE_DBC, m_hEnviroment, &m_hDatabaseConnection);
     if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
    {
         return  - 1 ;
    }
    
     // 准备连接工作
    SQLWCHAR* sqlwcaDsnName = _T( "mysqlDB" );         //数据源名称
    SQLWCHAR* sqlwcaUserName = _T( "root" );           //用户名称
    SQLWCHAR* sqlwcaPassWord = _T( "kingview" );       //密码
     // 连接数据源
    sqlReturn = SQLConnect( m_hDatabaseConnection
                            ,sqlwcaDsnName, SQL_NTS
                            ,sqlwcaUserName, SQL_NTS
                            ,sqlwcaPassWord, SQL_NTS);

     if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
    {
         return  - 1 ;
    }

     /* 申请SQL语句句柄 */
    SQLRETURN sqlReturn = SQLAllocHandle(SQL_HANDLE_STMT, m_hDatabaseConnection, &m_hStatement);
     if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
    {
         return   0 ;
    }

     /* 构造SQL语句 */
    CString cstrSql;
    cstrSql.Format(_T( "SELECT * FROM mytable " ));
 
     /* 执行SQL语句 */
    sqlReturn = SQLExecDirect(m_hStatement, cstrSql.GetBuffer(), SQL_NTS);
     if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
    {
         return   0 ;
    }
 
     /* 获得返回结果的行数 */
    SQLINTEGER sqlnIdCount =  0 ;
    sqlReturn = SQLRowCount(m_hStatement,&sqlnIdCount);
 
     /* 开始读取结果 */
     // 读取第一行时要调用,以后依次调用就可以下移行数,直到不返回SQL_SUCCESS
    sqlReturn = SQLFetch(m_hStatement);
     if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
    {
         return   0 ;
    }
 
    SQLINTEGER sqlnID;
    SQLINTEGER sqlnIDLength =  0 ;
 
     /* 获得数据 */
    SQLGetData(m_hStatement,  1 , SQL_C_ULONG, &sqlnID,  0 , &sqlnIDLength);
     // 参数1为执行语句的句柄,
     // 参数2为所要得到的数据位于的列数(SQL语句中),
     // 参数3为数据类型,这个比较多,需要看一下MSDN
     // 参数4为保存的位置(地址),
     // 参数5为参数4可用的位置,既然参数3已设定为长整型,所以这里可使用0
     // 参数6为实际返回的长度

     // 释放句柄,断开连接
    SQLFreeHandle(SQL_HANDLE_STMT, m_hStatement);
    SQLFreeHandle(SQL_HANDLE_DBC, m_hDatabaseConnection);
    SQLFreeHandle(SQL_HANDLE_ENV, m_hEnviroment);
 
https://blog.csdn.net/weixin_34293246/article/details/86013541?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
原文地址:https://www.cnblogs.com/xihong2014/p/15303646.html