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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM