ADO編程應用(1)

來源:互聯網
上載者:User
ado|編程 ADO(ActiveX Data Objects)是基於組件的資料庫編程介面,它是一個和程式設計語言無關的COM組件系統。本文主要介紹用ADO編程所需要注意的技巧和在VC下進行ADO編程的模式,並對C++ Extensions進行了簡單的討論,希望對ADO開發人員有一定的協助作用。因為ADO是一個和程式設計語言無關的COM組件系統,所以這裡討論的要點適用於所有的程式設計語言和編程環境,比如:VB、VBScript、VC、Java等等。
編程技巧
1.顯式定義物件類型
實際上,這條準則不僅適用於ADO編程,也適用於其他的與COM對象相關的編程。因為如果一開始就定義變數類型,則編譯器在編譯的時候就可以知道變數的類型,此時編譯器實際上是採用vtable位移的方式來得到具體的COM對象包含的方法的地址(這一點和C++中虛函數的地址擷取方式類似);但如果一開始不指定變數類型的話,比如簡單地採用如下的語句:
DIM myCon as Object
或者是:
DIM myCon
這樣,編譯器在編譯的時候就不能得到變數的類型,而只能在啟動並執行時候動態地得到方法的資訊(通過使用介面IDispatch的Invoke方法來實現),如此為了得到方法的地址和相關的變數情況就需要在內部進行兩次調用,無疑會降低程式的運行速度。
2.繫結資料行到具體的欄位對象
在程式開始時就建立對欄位對象的引用,可以避免在每次得到記錄後,再在Recordset::Fields中進行尋找而增加系統的開銷。
例如,可以採用如下所示的代碼:
Private Sub TblBrowse_Click()
Dim fld1 As ADODB.Field
Dim fld2 As ADODB.Field
Dim rs As ADODB.Recordset
set rs=g_cn.execute(...)
'g_cn為全域對象adodb.connection
Set fld1 = rs.Fields(“id”) '資料表的欄位
Set fld2 = rs.Fields(“name”) ’資料表的欄位
If rs.BOF = False Then
While rs.BOF = False
Debug.Print fld1.Value
Debug.Print fld2.Value
rs.MoveNext
Wend
End If
rs.Close
End Sub
3.用SQL語句和預存程序進行資料更新
儘管採用Recordset對象來更新資料是非常方便的,但是它的開銷也大,通過資料來源對象返回的查詢集不僅包含了資料,而且也包含了中繼資料(metadata),在有些時候中繼資料可能比資料本身還要大,所以最好採用SQL語句來更新資料。還有要使用預存程序而不是單一的SQL語句來擷取資訊。因為預存程序是在伺服器端執行的,只把結果返回到用戶端,這樣一方面可以降低網路進行資料互動的開銷,另一方面使系統更加容易維護,並且能保持資料的一致性。
4.使用集合操作單條的SELECT語句
在使用遊標時,最好使用集合的方法對單條的SELECT語句進行操作。Recordset::get_Collect方法和Recordset::put_Collect方法是Recordset 對象的捷徑,可以快速地得到一個欄位的值而不需要獲得關於一個欄位的引用。例如,可以採用如下代碼:
Sub Collect()
Dim rs As New Recordset
rs.ActiveConnection = “...”
rs.Source=“一條SQL查詢語句”
rs.Open
Debug.Print rs.Collect(0),rs.Collect(1),rs.Collect(2)
Debug.Print rs!au_id, rs!au_fname, rs!au_lname
End Sub
5.只查詢所需要的資料
儘管很多開發人員都習慣採用“SELECT * FROM TBL”的模式進行查詢,但是為了提高系統的效率,如果只需要其中某幾個欄位的值,最好把這幾個欄位直接寫出來,同時需要限定返回記錄集的範圍(通過WHERE子句進行限定)。
6.正確選擇遊標的位置、類型和鎖方式
如果只需要按順序讀取記錄並且不需要滾動和更新記錄,最好使用伺服器端遊標(adUseServer)、僅向前遊標(adOpenForwardOnly)和讀加鎖(adLockReadOnly),這樣可以獲得最好的效能。如果需要滾動記錄,採用用戶端資料指標(adUseServer)會比採用伺服器端遊標所得到的效能要好,因為ADO系統預設是採用伺服器端遊標類型。當然如果資料集合相當大,採用伺服器端遊標的效能會好一些。同時需要注意:如果採用用戶端資料指標,最好只採用讀加鎖(adLockReadOnly)的鎖類型,因為如果需要更新資料,用戶端資料指標引擎需要得到額外的資訊(中繼資料),而擷取這個資訊的代價是非常昂貴的。
7.調整記錄集對象的CacheSize屬性
ADO使用記錄集對象的CacheSize屬性來決定提取和緩衝的記錄的數目,當在緩衝的範圍內瀏覽資料時,ADO就只從緩衝中提取資料。當要瀏覽的資料超出緩衝範圍的時候,ADO就釋放當前緩衝,提取下一些記錄(提取的數目為CacheSize所指定的大小),所以必鬚根據具體的應用程式的情況,來設定CacheSize的大小,保證得到最佳的效能。
8.定義Command對象的參數
在許多資料來源中,得到參數資訊和執行命令的代價幾乎是一樣的,所以最好自己在程式中定義好Command參數(也就是說要定義好參數的名稱、類型和方向資訊),避免一些從資料提供者(Provider)那裡擷取資訊的操作。
9.使用原始的OLE DB提供者
MDAC對許多資料來源提供了原始的資料提供者,比如SQL Server、Oracle和Access資料庫,這樣就不需要再通過ODBC來擷取資料(也就是說不需要再通過ODBC驅動這一層),這樣的好處是能更快地得到資料,並且能降低磁碟和記憶體的開銷。
10.斷開Connection串連
如果使用用戶端資料指標,就要斷開Connection串連。ADO有一個特徵是當使用用戶端資料指標操作Recordset記錄集的時候,不需要和伺服器保持聯絡。所以可以充分利用這個特性降低伺服器端的開銷(伺服器就不需要維護這些串連了)。當操作完記錄集需要更新時,可以重新和資料庫進行串連來更新資料。為了建立一個可以中斷連線的記錄集,同時需要使用靜態資料指標(adOpenStatic)和批處理的加鎖模式(adLockBatchOptimistic)。下面是有關處理的VC代碼:
pRs.CreateInstance(__uuid(Recordset));
pRs->CursorLoction=adUseClient;
pRs->Open(strCmdText,strConnection,adOpenStatic,adLockBatchOptimistic,adCmdText);
pRs->PutRefActiveConnection(NULL);
//對記錄集對象pRs進行操作
//重新和資料庫建立串連
pRs->PutRefActiveConnectio(pCon);
//批次更新資料
pRs->UpdateBatch(adAffectAll);
需要注意的是:當執行批次更新時,必須自己處理資料衝突問題,因為更新資料時,其他使用者也可能同時正在對該資料進行操作。
11.使用adExecuteNoRecords選項
如果不需要返回記錄,要使用adExecuteNoRecords選項。ADO 2.0包括一個新的執行選項稱為adExecuteNoRecords。當使用該選項的時候,ADO就不會建立記錄集對象,不設定任何遊標屬性。資料提供者因為不需要認證集合的屬性而使效能得到最佳化。具體的例子如下:
con.Execute “insert into tbl values(fv1, fv2) ”, , adExecuteNoRecords
對僅有一條的執行語句採用Connection::Execute方法比使用Recordset::Open方法或者是Command::Execute方法的效果要好,因為ADO不保留任何命令狀態的資訊,因此執行效能就有所改進。
12.使用session/connection緩衝池
因為資料庫的開啟和關閉非常消耗系統資源,因此,使用串連池對基於多層的應用的效能會有很大的提高。當使用MDAC的時候,開發人員本身並不需要考慮對資料庫連接的緩衝,MDAC會自動處理它。串連池在兩個層次上提供支援:OLE DB sessions和ODBC串連。如果使用ADO,資料庫連接會自動被OLE DB session緩衝池所緩衝;如果使用ODBC,可以利用在ODBC資料來源管理中新的串連緩衝池選項對ODBC緩衝進行設定。
實現方法
我們知道,在VB下進行基於ADO的編程相對比較簡單,只要通過reference載入了適當的類型庫後,就可以正常地調用ADO對象。但是對於VC下的基於ADO的資料庫開發就稍微複雜一些。VC中實現對ADO操作通常有三種方法:
●#import方法;
●利用MFC OLE的ClassWizard;
●通過Windows API中COM相關的函數。
在這三種方法中,#import是最方便的方法,它允許產生一個類似VB的類結構,使程式開發變得很方便。下面分別介紹這三種方法。
1.#import方法
在#import方法中,需要提供所要包含的類型庫的路徑和名稱,VC能夠自動產生一個對GUIDs的定義,以及自動產生對ADO對象的封裝。對任何引用的類型庫,VC會在編譯的時候自動產生兩個檔案:
●標頭檔(.tlh):包含了所列舉的類型和對類型庫中對象的定義;
●實現檔案(.tli):對類型庫物件模型中的方法產生封裝。
例如,在stdafx.h檔案中增加對msado15.dd的#import之後,VC會產生msado15.tlh和msado15.tli兩個檔案。
#import能夠使用一個新的類_com_ptr_t,它也被稱為智能指標。智能指標能夠自動執行QuyerInterface、AddRef和Release函數。
下面的代碼示範了如何使用#import在應用中實現對ADO的操作:
#import “c:\program files\co



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。