1.引言 近年來,隨著計算機局域網技術的不斷發展,計算機體系結構已經發展到復雜而開放的客戶機/服務器模式。對于客戶機/服務器應用的開發,現在常用的前端開發工具有:VisualBasic、Delphi、PowerBuilder等。它們可通過ODBC接口訪問服務器的SQLServer數據庫服務器。 VisualBasic、Delphi、PowerBuilder等開發工具在使用ODBC2.0來編寫程序時,通常會提供三種方法來進行數據庫應用程序的方案設計: ·使用數據控制項 ·使用數據庫對象變量進行編程 ·直接調用ODBC2.0API 在客戶機/服務器模式下進行數據庫應用程序設計時,僅用前兩種方法往往是不夠的。因為采用前兩種方法,其執行模式對于程序員是透明的,而ODBC2.0訪問數據庫時存在同步與異步執行模式之分,故容易因設計不當,發生系統死鎖。因此,在實際編程序時,我們需要采用第三種方法來解決由同步和異步執行模式所造成的問題。
2.同步和異步執行模式 ODBC2.0訪問數據庫時,有同步執行模式與異步執行模式之分。 所謂同步執行模式,是指語句在同步執行模式下,將始終保持對程序流的控制,直至程序結束。例如查詢操作,客戶機上的應用程序在向服務器發出查詢操作的指令后,將一直等待服務器將查詢結果返回客戶機端后,才繼續進行下一步操作, 所謂異步執行模式,是指語句在異步執行模式下,各語句執行結束的順序與語句執行開始的順序并不一定相同。例如查詢操作,客戶機上的應用程序在向服務器發出了查詢操作的指令后,將立刻執行查詢語句的下一條語句,而不需要等到服務器將查詢結果返回客戶機端后,才繼續進行下一步操作。 在一些應用程序開發工具中,在其提供使用數據控制項和數據庫對象變量進行編程的同時,并沒有很好地考慮到同步執行模式與異步執行模式的重要區別。為了使程序運行速度更快,其語句執行的缺省模式為異步模式。對于一般程序員來說,如果他對同步執行模式與異步執行模式不了解的話,他往往會在對服務器發出一個操作語句(查詢或讀取一條記錄等操作)后,立刻引用服務器返回的執行結果,或者對該結果進行下一步操作;在異步執行模式下,客戶機上的后續語句是在該操作語句發出后接著執行的,但由于各種原因,服務器不一定能執行完該操作語句,并在后續語句執行前將結果返回客戶機。因此,后續語句在引用前一操作語句的執行結果時,往往會因為該執行結果并不存在而引用了錯誤的值,造成系統錯誤或死鎖。
3.解決方案 解決上面所提到的問題,可以采取以下兩種方案: ①利用ODBC2.0API,將語句執行狀態設置為同步執行模式。ODBC2.0API中,函數SQLSetStmtOption()的功能是設置同步或異步執行模式。我們可以采用以下語句,將語句執行狀態設置為同步執行模式:iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-ENABLE,0) 其中,hStmt是一有效的語句句柄,常數SQL-ASYNC-ENABLE是所要設置的選項,參數0表示該選項(即異步執行模式)關閉。如果iRetCode返回SQL-SUCCESS,則表示語句執行狀態已被設置為同步執行模式。 ②利用ODBC2.0API,將語句執行狀態設置為異步執行模式,然后在程序中不斷查詢一個操作語句是否已經執行完畢。 ODBC2.0API中共有20多個函數支持異步執行,如上頁表所示。 這些函數第一次調用后,將返回值SQL-STILL-EXECUTING,這時應用程序將繼續執行后續語句。過了一段時間后,應該再次調用原函數,而且要注意:實參數應傳入與第一次調用時相同的語句句柄,其他參數也應一樣(但會被忽略)。如果函數返回值為SQL-SUCCESS,則表明該語句已經執行完畢;如果函數返回SQL-STILL-EXECUTING,則表明該語句仍在執行中。 我們可以用一個簡單的例子說明如下: iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-ENABLE,1) ′置語句執行模式為異步執行模式 iRetCodeΚSQLExecDirect(hStmt,″SELECT*FROMemployees″,23) ......′執行其他操作 iRetCodeΚSQLExecDirect(hStmt,″SELECT*FROMemployees″,23) ′判斷SQLExecDirect()是否已執行完畢 If(iRetCodeΚSQL-STILL-EXECUTING)Then ......′該語句未執行完,繼續執行其他操作 Else If(iRetCodeΚSQL-SUCCESS)Then ......′該語句已執行完,可對語句操作結果進行處理 EndIf EndIf 同步執行模式可以簡化程序編制的復雜性,對ODBC2.0API不十分熟悉的程序員,可以不用過多地了解比較復雜的ODBC2.0API,而只需使用數據控制項和數據庫對象變量來編寫應用程序,使開發效率大大提高,但程序運行速度比不上異步執行模式的速度。 異步執行模式雖然在編程序時十分復雜,但在這種模式下可以進行多任務并行執行,使執行效率大大提高。 我們在編制應用程序時,應根據自身的情況,對這兩種模式的使用進行劃分,以便既提高程序運行的安全可靠性,又提高程序執行的效率。
|