為了存取ODBC數據源,應用程序應該包含以下的步驟:
1.連接ODBC數據源
要求給定ODBC數據源名稱以及其他一些必要的信息。
在應用程序調用ODBC函數之前,必須初始化ODB接口,建立一個環境句柄。首先聲明一個環境句柄變量,如:
Dim hEnv1 as Long
如果使用的是ODBC 2.X,那麼調用函數SQLAllocEnv,並把環境變量以引用傳遞的方式傳給該函數。驅動程序管理器將初始化ODBC環境,為環境句柄分配存儲空間,並返回一個環境句柄,如:
SQLAllocEnv(hEvn1)
如果使用的是ODBC 3.X,那麼參數SQL_NULL_EVN調用函數SQLAllocHandle,如:
SQLAllocHandle (SQL_HANDLE_ENV,SQL_NULL_HANDLE,hEnv1)
以上步驟在一個應用程序中只能進行一次。但在一個ODBC環境中可以連接多個數據源。下面就來看如何連接數據源。
在連接數據源之前,應用程序先分配一個或多個連接句柄。首先聲明一個連接句柄變量,如:
Dimn hDbc1 as Long
如果使用的是ODBC 2.x,那麼調用函數SQLAllocConnect,並把連接句柄變量以引用傳遞的方式傳給該函數。驅動程序管理器為該連接分配一塊儲存空間,並返回一個連接句柄,如:
SQLAllocConnect(hEnv1,hDbc1)
如果使用的是ODBC 3.x,那麼用參數SQL_HANDLE_DBC和環境句柄來調用函數SQLAllocHandle,如:
SQLAllocHandle(SQL_HANDLE_DBC,hEnv1,hDbc1)
現在就可以指定驅動程序和數據源了,並且用函數SQLDriverConnect來連接指定的數據源。如:
2.處理SQL語句
(1)應用程序把SQL語句字符串放入一個緩沖區。如果這個SQL語句含有參數,還應該設置參數值。
(2)如果SQL語句返回一個結果集,還要為該語句早班一個游標名。
(3)應用程序以“准備”或“立即執行”的方式提交SQL語句。
(4)如果SQL語句建立一組結果集,應用程序可以查詢結果的屬性,例如列數、列的數據類型等。為每一列連接一個緩沖並提取結果。
(5)如果SQL語句產生錯誤,則提取錯誤信息並采取相應的措施。
在處理SQL語句之前,首先必須分配一個語句句柄。先聲明一個語句句柄變量,如:
Dim hStmtl as ling
如果使用是的ODBC 2.X,那麼調用函數SQLAllocStmt,如:
SQLAllocStmt1(hDbc1,hStmt1)
如果使用的是ODBC 3.X,那麼用參數SQL_HANDLE_STMT和參數hDbc1調用函數SQLAllocHandle,如:
SQLAllocHandle(SQL_HANDLE_STMT,hDbc1,hstmt1)
接下來就可以執行SQL語句了,如果采用“准備”方式執行sql語句,應用程序要做如下步驟:
(1)調用SQLPrepare函數准備一個SQL語句,把SQL語句作為函數的一個參數,例如:
SQLPrepare(hStmt1,"Select Name,Age From Employee Where AGE=?",SQL_NTS)。
(2)設置SQL語句中的參數值。如果SQL語句中出現了問號(?),那麼表明這個SQL語句是帶參數的,如:
SQLBindParameter(hStmt1,1,SQL_Param_INPUT),
SQL_C_Clong.SQL_INTEGER,0,0,age,0 name,vbNull).
這樣每次查詢後,Name字段值就存放在變量name中。
(3)調用函數SQLExecute來執行SQL語句。如:SQLExecute(hStmt1)
(4)提取查詢結果.這個任務由函數SQLFetch來完成,如SQLFetch(hStmt1).
(5)根據程序需要,可有選擇地進行這五個步驟.
如果是采用"立即執行"方式執行SQL語句,那麼省去上面的第一步,在執行SQL語句時,用函數SQLExecuteDirect.如:
但是就速度而言,"准備"方式比"立即執行"方式要快,因此,只在下面情況下,考慮使用"立即執行"方式:
(1)應用程序的SQL語句只執行一次;
(2)應用程序在執行前不需要查詢有關結果信息.
3.結束事務
可以提交事務,也可以撤銷事務。有兩種提交事務的模式:一種是自動模式,另一種是手動模式。
在自動模式下,每個SQL語句都被認為成一個完整的事務而自動提交。在手動模式下,事務由一個或幾個SQL語句組成,如果應用程序提交一個SQL語句時沒有活動事務,驅動程序就建立一個新的事務,在後續的SQL語句提交過程中,驅動程序保持這個處於活動的事務,直到應用程序調用函數SQLTransact(ODBC2.X)或SQLENDTRAN(ODBC 3.X)進行事務提交或撤消。
如果驅動程序支持SQL_AUTOCOMMIT連接選項,則缺省的事務模式是自動提交模式;如果不支持SQL_AUTOCOMMIT連接選項,則缺省的事務模式是手動模式。應用程序可以調用函數SQLSetConnectOption(ODBC2.X)或SQLSetconnectAttr(ODBC3.X)進行自動/手動提交模式切換。在進行模式交換時,驅動程序將自動提交當前連接中的所有活動事務。
應用程序應該用函數SQLTransact或SQLEndTrans來處理事務,而不要用SQL語句中的COMMIT或ROLLBACK來處理事務,COMMIT或ROLLBACK語句的結果取決於驅動程序及相連接的數據源。
注意:不管是用自動模式還是用手動模式處理事務,也不管是提交事務還是撤銷事務,只要是事務處理都將引起數據源關閉游標並刪除與該數據源有關的所有存儲計劃。
4.中斷連接
在完成對數據庫的存取後,中斷與數據源的連接。
用函數SQLDisconnect來中斷與數據源的連接。例如,下面的語句中斷連接句柄hDbc1所指的數據源連接。
SQLDisconnect(hDbc1)
在中斷連接後,必須釋放所有的句柄,包含語句句柄、連接句柄和環境句柄。
當使用ODBC2.X時:
(1)釋放語句句柄,用函數SQLFreestmt,如SQL_DROP;
(2)釋放連接句柄,用函數SQLFreeConnect,如SQLFreeConnect(hDbc1);
(3)釋放環境句柄,用函數SQLFreeEnv,如SQLFreeEnv(hEnv1)。
當使用ODBC3.XJF ,釋放連接句柄和環境都用函數SQLFreeHandle,只不過帶的參數不同。當釋放連接句柄時,用參數SQL_HANDLE_DBC;當釋放環境句柄時,用參數SQL_HANDLE_ENV。如果釋放語句句柄時用SQL_DROP,那麼,也使用SQLFreeHandle函數,參數改為SQL_HANDLE_STMT,否則和ODBC2.XG一樣使用SQLFreeStmt.