線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1311
推到 Plurk!
推到 Facebook!

ODBC中的同步與非同步執行模式

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-30 09:08:23 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 ODBC中的同步與非同步執行模式 1.引言 近年來,隨著電腦局域網技術的不斷發展,電腦體系結構已經發展到複雜而開放的客戶機/伺服器模式。對於客戶機/伺服器應用的開發,現在常用的前端開發工具有:VisualBasic、Delphi、PowerBuilder等。它們可通過ODBC介面訪問伺服器的SQLServer資料庫伺服器。 VisualBasic、Delphi、PowerBuilder等開發工具在使用ODBC2.0來編寫程式時,通常會提供三種方法來進行資料庫應用程式的方案設計: ·使用資料控制項 ·使用資料庫物件變數進行編程 ·直接調用ODBC2.0API 在客戶機/伺服器模式下進行資料庫應用程式設計時,僅用前兩種方法往往是不夠的。因?採用前兩種方法,其執行模式對於程式師是透明的,而ODBC2.0訪問資料庫時存在同步與非同步執行模式之分,故容易因設計不當,發生系統鎖死。因此,在實際編程式時,我們需要採用第三種方法來解決由同步和非同步執行模式所造成的問題。 2.同步和非同步執行模式 ODBC2.0訪問資料庫時,有同步執行模式與非同步執行模式之分。 所謂同步執行模式,是指語句在同步執行模式下,將始終保持對程式流的控制,直至程式結束。例如查詢操作,客戶機上的應用程式在向伺服器發出查詢操作的指令後,將一直等待伺服器將查詢結果返回客戶機端後,才繼續進行下一步操作,如圖1所示。 圖1同步執行模式 所謂非同步執行模式,是指語句在非同步執行模式下,各語句執行結束的順序與語句執行開始的順序並不一定相同。例如查詢操作,客戶機上的應用程式在向伺服器發出了查詢操作的指令後,將立刻執行查詢語句的下一條語句,而不需要等到伺服器將查詢結果返回客戶機端後,才繼續進行下一步操作。如圖2所示。 圖2非同步執行模式 在一些應用程式開發工具中,在其提供使用資料控制項和資料庫物件變數進行編程的同時,並沒有很好地考慮到同步執行模式與非同步執行模式的重要區別。?了使程式運行速度更快,其語句執行的缺省模式?非同步模式。對於一般程式師來說,如果他對同步執行模式與非同步執行模式不瞭解的話,他往往會在對伺服器發出一個操作語句(查詢或讀取一條記錄等操作)後,立刻引用伺服器返回的執行結果,或者對該結果進行下一步操作;在非同步執行模式下,客戶機上的後續語句是在該操作語句發出後接著執行的,但由於各種原因,伺服器不一定能執行完該操作語句,並在後續語句執行前將結果返回客戶機。因此,後續語句在引用前一操作語句的執行結果時,往往會因?該執行結果並不存在而引用了錯誤的值,造成系統錯誤或鎖死。 3.解決方案 解決上面所提到的問題,可以採取以下兩種方案: ?利用ODBC2.0API,將語句執行狀態設置?同步執行模式。ODBC2.0API中,函數SQLSetStmtOption()的功能是設置同步或非同步執行模式。我們可以採用以下語句,將語句執行狀態設置?同步執行模式:iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-ENQABLE,0) 其中,hStmt是一有效的語句控制碼,常數SQL-ASYNC-ENABLE是所要設置的選項,參數0表示該選項(即非同步執行模式)關閉。如果iRetCode返回SQL-SUCCESS,則表示語句執行狀態已被設置?同步執行模式。 ?利用ODBC2.0API,將語句執行狀態設置?非同步執行模式,然後在程式中不斷查詢一個操作語句是否已經執行完畢。 ODBC2.0API中共有20多個函數支援非同步執行,如上頁表所示。 這些函數第一次調用後,將返回值SQL-STILL-EXEQCUTING,這時應用程式將繼續執行後續語句。過了一段時間後,應該再次調用原函數,而且要注意:實參數應傳入與第一次調用時相同的語句控制碼,其他參數也應一樣(但會被忽略)。如果函數返回值?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,而只需使用資料控制項和資料庫物件變數來編寫應用程式,使開發效率大大提高,但程式運行速度比不上非同步執行模式的速度。 非同步執行模式雖然在編程式時十分複雜,但在這種模式下可以進行多工並行執行,使執行效率大大提高。 我們在編制應用程式時,應根據自身的情況,對這兩種模式的使用進行劃分,以便既提高程式運行的安全可靠性,又提高程式執行的效率。
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-11-25 18:33:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!