ODBC應用程式的最終目的是通過ODBC API函數執行SQL語句,完成各種資料庫操作。ODBC對資料庫的訪問通過控制代碼來實現,常用的三個基本的控制代碼是:
環境控制代碼:建立應用程式與ODBC系統之間的聯絡,只有一個環境控制代碼。
串連控制代碼:把ODBC與資料來源建立起聯絡,可以有多個串連控制代碼。
語句控制代碼:用來與SQL語句操作建立聯絡,以便執行SQL語句。ODBC應用程式中,任何一個處理SQL語句的ODBC函數都需要一個語句控制代碼作參數。
環境控制代碼、串連控制代碼和語句控制代碼是ODBC應用程式中使用最為頻繁的三個對象,一個應用程式只應該建立一個環境控制代碼,由該環境控制代碼實現應用程式與ODBC動態連結程式庫的串連。但在一個環境控制代碼下可以建立多個串連控制代碼,通過這些串連控制代碼,應用程式可以實現與多個不同資料來源的串連,為應用程式提供同時處理不同資料庫系統資料的能力。同樣,在一個串連控制代碼下可以申請多個語句控制代碼,使用這些語句控制代碼執行多個SQL語句。
語句控制代碼的申請和釋放操作與環境控制代碼和串連控制代碼類似,下面介紹應用程式應該怎樣申請和釋放語句控制代碼,以及SQL語句的執行過程。圖6-19給出ODBC申請和釋放語句控制代碼的流程。
1.申請語句控制代碼
2.釋放語句控制代碼
3.執行SQL語句
1.申請語句控制代碼
SQLAllocStmt函數為應用程式分配語句控制代碼,其格式為:
RETCODE SQLAllocStmt(
HDBC hdbc,
HSTMT FAR * phstmt
)其中,hdbc為串連控制代碼。每個語句控制代碼總是與一個串連控制代碼相關聯,所以在申請語句控制代碼時,要提供一個有效串連控制代碼,否則,SQLAllocStmt函數將返回錯誤碼:SQL_INVALID_HANDLE。
Phstmt為輸出參數,它是一個指向語句控制代碼變數的指標,當SQLAllocStmt函數執行成功時,它返回SQL_SUCCESS,並將為應用程式分配的語句控制代碼儲存到指定的語句控制代碼變數中,否則返回SQL_ERROR。
2. 釋放語句控制代碼
在使用語句控制代碼處理完資料庫操作後,應用程式應調用SQLFreeStmt函數關閉語句控制代碼的遊標、釋放為結果集合所分配的緩衝區、釋放語句控制代碼,從而釋放它佔用的系統資源。 SQLFreeStmt函數的格式為:
RETCODE SQLFreeStmt(
HSTMT hstmt,
UWORD fOption
)
其中,hstmt為待釋放的語句控制代碼,fOption參數控制SQLFreeStmt函數的動作。因為SQLFreeStmt函數不僅僅用來釋放語句控制代碼,它還有其它多種功能,如能夠關閉遊標,釋放列和參數緩衝區等,SQLFreeStmt函數的所有這些功能由fOption參數的取值決定。
FOption參數取值如下:
.SQL_CLOSE:關閉與hstmt控制代碼相關聯的遊標,廢除所有正在處理的結果。關閉遊標後,再次執行SELECT語句可以重新開啟遊標;
.SQL_DROP:關閉所有與hstmt相關聯的遊標,廢除正在處理的結果,結束一切對hstmt控制代碼的訪問,並釋放hstmt 控制代碼;
.SQL_UNBIND:解除SQLBindCol函數為hstmt結果集合所關聯的所有列緩衝區;
.SQL_RESET_PARAS:釋放SQLBinParameter函數為hstmt控制代碼所關聯的參數緩區。
圖6-19 ODBC各種控制代碼的申請和釋放流程圖
3. 執行SQL語句
ODBC應用程式的最終目的是通過ODBC API函數執行SQL語句,完成各種資料庫操作。前面介紹的內容都是為執行SQL語句做準備。圖6-20是ODBC執行SQL語句的簡單流程。
圖6-20
ODBC應用程式設計的核心內容之一是執行SQL語句。內容包括申請和釋放語句控制代碼、SQL語句的執行方式及參數傳遞、選擇SQL語句執行方式(同步執行和非同步執行)執行SQL語句,以及交易管理等。ODBC應用程式通過執行SQL語句實現各種資料庫操作,完成使用者指定的程式功能。有關SQL語句的執行方式有兩種:
(1) 直接執行:調用ODBC的SQLExecDriect()函數
如果以下兩方面都成立,用直接執行方式提交SQL語句:
· 該SQL語句只執行一次;
· 應用在執行前不需要結果集的資訊。
採用立即執行方式執行一條SQL語句比較簡單,實現過程也很直觀。首先將要執行的SQL語句文本傳遞給SQLExecDirect函數,SQL語句經驅動程式分析後立即提交給資料來源執行。
SQLExecDirect函數的格式是:
SQLExecDirect(HSTMT hstmt,UCHAR FAR * szSqlstr, SCWORD cbSqlstr)
其中:
· Hstmt為語句控制代碼。
· SzSqlStr為SQL語句文本緩衝區;
· cbSqlStr參數說明SQL語句文本的長度。使用C或C++編程時,可將它設定為SQL_NTS。
語句成功執行後,SQLExecDirect函數返回SQL_SUCCESS。
例如,下面代碼通過SQLExecDirect函數立即執行一個資料庫查詢語句:
rc=SQLExecDirect(hstmt,'SELECT*FROM authors', SQL_NTS);
(2) 準備執行:應用程式執行一條SQL語句需要兩步實現先調用ODBC的SQLPrepare()函數準備SQL語句,再調用ODBC的SQLExecute()函數執行準備好SQL語句。
如果以下兩條件之一成立,用準備執行方式提交SQL語句:
* 該SQL語句要執行多次;
* 應用在執行前需瞭解結果集的資訊
在準備過程中,驅動程式將SQL語句轉換為資料來源本地SQL格式(有些驅動程式還對SQL語句進行句法分析)之後將它提交給資料來源,資料來源再對SQL語句進行編譯,設計訪問計劃,最後將訪問計劃描述符返回給驅動程式。
與立即執行相比,SQLExecute函數執行一個準備好的SQL語句的速度要快於前者,因為它省去了驅動程式和資料來源對SQL語句的處理時間。應用程式究竟採用哪種方式執行SQL語句,主要考慮該語句是否要多次執行。
SQLPrepare 函數的格式是:
RETCODE SQLPrepare(HSTMT hstmt,UCHAR FAR * szSqlstr, SCWORD cbSqlstr)
其中:
· Hstmt為語句控制代碼。
· SzSqlStr為SQL語句文本緩衝區;
· cbSqlStr參數說明SQL語句文本的長度。
準備好的SQL語句通過SQLExecute函數執行,SQLExecute函數的格式比較簡單,它只需一個準備語句使用的語句控制代碼,即:
RETCODE SQLExecute(HSTMT hstmt)
SQLPrepare函數準備好的SQL語句可以被SQLExecute函數多次執行。在每次執行時,可使用不同的語句參數。但是,當調用SQLExecute函數再次執行一個SELECT語句時,應用程式必須先使用SQL_CLOSE參數調用SQLFreeStmt函數,關閉與該語句控制代碼相關聯的遊標,廢除它正在處理的結果集合,然後再執行SELECT語句,產生新的結果集合。
與立即執行相比,SQLExecute函數執行一個準備好的SQL語句的速度要快於前者,因為它省去了驅動程式和資料來源對SQL語句的處理時間。應用程式究竟採用哪種方式執行SQL語句,主要考慮該語句是否要多次執行。
說明:
· 異構資料庫訪問和ODBC技術,對開發人員和使用者的好處是十分明顯的。但是,用ODBC技術進行異構資料庫訪問還有一些不足:
· 每個DBMS都提供自己的ODBC介面,自己的資料類型、單獨的SQL版本和功能。許多介面不符合標準,使得相同的代碼訪問不同的資料庫時,結果會出現不一致;
· 使用ODBC介面應用程式的效率會降低。