ADO技巧精華10則
發表于:2007-06-30來源:作者:點擊數:
標簽:
我使用ActiveX Data Object(ADO)是從1.5版本開始,那已經是一個非常古老的版本了?,F在的版本中,許多東西都發生了變化。從每一次版本升級中我都學到許多新的東西。這些東西你不能全部從書本上找到,或者至少可以說,不能從一個地方找到。 我在這里精心選擇
我使用ActiveX Data Object(ADO)是從1.5版本開始,那已經是一個非常古老的版本了?,F在的版本中,許多東西都發生了變化。從每一次版本升級中我都學到許多新的東西。這些東西你不能全部從書本上找到,或者至少可以說,不能從一個地方找到。
我在這里精心選擇和總結了這些ADO
開發要點和技巧。其中有些問題可能就是你一直念念不忘的問題;有些是你從來不曾了解的技術;還有一些只是分門別類地展示ADO開發的
知識精華。
一、共享連接對象
把連接字符串傳遞給Command、Recordset或者Record對象時,每次你都是在隱含地命令ADO創建一個Connection對象:
Dim rec1 As ADODB.Record
Dim rec2 As ADODB.Record
Dim rec3 As ADODB.Record
Set rec1 = New ADODB.Record
rec1.Open "localstart.asp", "URL=http://localhost/"
Set rec2 = New ADODB.Record
rec2.Open "global.asa", "URL=http://localhost/"
Set rec3 = New ADODB.Record
rec3.Open "iisstart.asp", "URL=http://localhost/"
‘’ 執行一些操作
rec1.Close
rec2.Close
rec3.Close
Set rec1 = Nothing
Set rec2 = Nothing
Set rec3 = Nothing
為了節省資源,你應該先創建一個Connection對象,然后把它傳遞給所有要求活動連接的對象。也就是說,上面的代碼應該改成下面這種形式:
Dim con As ADODB.Connection
Dim rec1 As ADODB.Record
Dim rec2 As ADODB.Record
Dim rec3 As ADODB.Record
Set con = New ADODB.Connection
con.Open "URL=http://localhost/"
Set rec1 = New ADODB.Record
rec1.Open "localstart.asp", con
Set rec2 = New ADODB.Record
rec2.Open "global.asa", con
Set rec3 = New ADODB.Record
rec3.Open "iisstart.asp", con
‘’ 執行一些操作‘’
rec1.Close
rec2.Close
rec3.Close
con.Close
Set rec1 = Nothing
Set rec2 = Nothing
Set rec3 = Nothing
Set con = Nothing
二、讀取ConnectionString屬性
從任何已經打開的Connection對象中,包括由Recordset、Command、或者Record對象的ActiveConnection屬性返回的Connection對象,你總是可以讀取到ConnectionString屬性。
Dim com As ADODB.Command
Dim rst As ADODB.Recordset
Set com = New ADODB.Command
com.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=NWind.mdb;"
com.CommandText = "SELECT * FROM Customers"
Set rst = com.Execute
MsgBox com.ActiveConnection.ConnectionString
rst.Close
Set rst = Nothing
Set com = Nothing
上述代碼運行時,你將從消息框看到如下輸出:
Provider=Microsoft.Jet.OLEDB.4.0;
Password="";
User ID=Admin;
Data Source=NWind.mdb;
Mode=Share Deny None;
Extended Properties="";
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=4;
Jet OLEDB:Database Locking Mode=0;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don‘’t Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False
現在你就可以分析這個字符串,找出有關該連接的特定信息,比如當
數據庫被壓縮時它是否會被加密(Jet OLEDB:Encrypt Database屬性)。
三、使用動態屬性
Connection對象的Properties集合可用來設置供應商特有的選項,比如
SQL Server的OLE DB驅動程序的Prompt動態屬性。
Dim con As ADODB.Connection
Set con = New ADODB.Connection
con.Provider = "SQLOLEDB"
con.Properties("Prompt") = adPromptAlways
con.Open
‘’ 提示用戶選擇數據庫‘’
con.Close
Set con = Nothing
上述代碼運行時,用戶將看到一個對話框,這個對話框允許用戶選擇要登錄到哪一個數據庫。
四、明智地選擇游標位置
選擇游標的位置時,你必須考慮對于當前連接來說哪些服務比較重要。
如果數據提供者的服務正是你所需要的,你應該使用
服務器端游標。這些服務是數據源驅動程序提供的服務,它們通常具有非常好的可伸縮性。另外,通過保留服務器端游標,你無需象使用客戶端游標那樣總是把全部的數據發送到客戶端。
另一方面,本地游標服務,例如Microsoft數據形狀服務for OLE DB,能夠提供一些客戶端游標特有的服務。要讓這些服務能夠起作用,數據必須發送到本地機器上,正如數據形狀服務所要求的一樣。
你可以用Connection.CursorLocation屬性設置游標的位置,但選擇應該明智、慎重。
五、明智地選擇游標類型
選擇游標的類型與選擇游標的位置同樣重要。游標共有四種類型,每一種類型都有各自的優點和缺點。
Static游標(靜態游標)提供了數據在給定時刻的一個快照。在這種類型的游標中,數據改動(包括其他用戶的數據增加或者刪除操作)總是不可見。static游標用來制作報表很理想,因為制作報表需要有數據的一個一致的、不會變化的視圖,但static游標不一定速度最快。由于數據的改變不會顯示出來,對于每一個使用static游標的連接,服務提供者必須分別為它創建和維護一份給定時刻的數據副本。
Forward Only游標(只能向前的游標)與靜態游標基本相同,不同之處在于你只能向前移動訪問數據,但不能向后。與Static游標相比,這個限制有利于提高
性能,但它仍舊要求數據源維護一個數據的臨時副本,使得其他用戶對數據的改動不會影響你的數據。
Dynamic游標(動態游標)允許你看到其他用戶對數據的修改和刪除操作,而且你可以在整個記錄集之內自由地移動。與Static和Forward Only游標不同,Dynamic游標不要求數據源維護一份數據的靜態映像,因此Dynamic游標要比前兩種游標快。
最后一種游標類型是Keyset游標(鍵集游標)。Keyset游標與Dynamic游標非常相似,不同之處在于你不能看到其他用戶新增的記錄。在Keyset游標中,其他用戶刪除的記錄也將不可訪問。和Dynamic游標一樣,Keyset游標中你也可以看到其他用戶的修改。Keyset游標可能要比Dynamic游標快,這是因為Keyset游標不需要經常地去檢查是否有新記錄加入、是否有記錄被刪除(因為新增的記錄不可見,被刪除的記錄變成不可訪問)。
考慮每一個理由,然后再選擇適合你的游標類型。
六、手工構造參數
當性能因素很重要時,請手工定義參數:
Dim con As ADODB.Connection
Dim com As ADODB.Command
Dim par As ADODB.Parameter
Dim rst As ADODB.Recordset
Set con = New ADODB.Connection
con.Open "Provider=SQLOLEDB;" & "Server=localhost;" _
& "Initial Catalog=Northwind;" & "User ID=sa;"
Set com = New ADODB.Command
Set com.ActiveConnection = con
Set par = com.CreateParameter ("CategoryName", adVarWChar, _
adParamInput, 15)
com.Parameters.Append par
Set par = com.CreateParameter ("OrdYear", adVarWChar, _
adParamInput, 4)
com.Parameters.Append par
com.CommandText = _
"EXECUTE SalesByCategory ‘’Produce‘’, ‘’1997‘’"
Set rst = com.Execute
‘’ 執行一些操作‘’
rst.Close
con.Close
Set com = Nothing
Set rst = Nothing
Set con = Nothing
采用手工方式定義參數之后,ADO不必為了找出存儲過程的參數列表而去查詢數據源。當用戶只執行一個查詢過程且對存儲過程執行時間要求不高時,這一點不是很重要;但是,如果用戶要執行大量的存儲過程,而且希望能夠立即得到答案,那么這一點就很重要了。
七、用Stream對象構造緩存
Stream對象可以在沒有物理數據源的情況下使用。你可以利用這個對象在本地機器的內存中創建緩存。用法很簡單,只需先創建Stream對象的實例,然后就可以開始寫入數據:
Dim str As ADODB.Stream
Set str = New ADODB.Stream
str.Open
str.WriteText "這是文本信息,"
str.WriteText "我們希望它保留在"
str.WriteText "內存中。", adWriteLine
str.WriteText "這是第二"
str.WriteText "行", adWriteLine
MsgBox "緩存中共有" & _
str.Size & "個字符"
str.Position = 0
MsgBox "緩存內容: " & str.ReadText
str.Close
另外,你還可以用Stream對象處理二進制數據,只需用Write和Read方法取代操作文本的WriteText和ReadText方法。把數據放入緩存之后,你可以用SaveToFile方法永久保存數據。
八、檢查警告信息
Connection對象的Errors集合不僅用來報告數據提供者在執行某個操作時出現的錯誤,而且它還用于指示執行操作過程中出現的非致命性警告信息。
Connection.Open、Recordset.CancelBatch、Recordset.Resync以及Recordset.UpdateBatch方法,還有Recordset.Filter屬性,都有可能產生警告信息。
要檢測數據提供者的警告信息(或錯誤信息),請在使用上述任何方法啟動某個操作之前調用Connection.Errors.Clear方法;操作完成后,用Errors集合的Count屬性檢查是否存在任何警告信息。
九、事務嵌套
使用Jet OLE DB provider時,你可以嵌套事務,最多五層。使用多層事務將賦予你空前的數據控制能力。
Dim con As ADODB.Connection
Dim iLevel As Integer
Set con = New ADODB.Connection
con.CursorLocation = adUseClient
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=NWind.mdb;"
con.BeginTrans
‘’ 改動 1
con.BeginTrans
‘’ 改動 2
con.BeginTrans
‘’ 改動 3
iLevel = con.BeginTrans
‘’ 改動 4
MsgBox "Level " & iLevel
con.CommitTrans
con.RollbackTrans
con.CommitTrans
con.CommitTrans
con.Close
Set con = Nothing
在上面這個例子中,改動1和2將成功,改動3和4無效。改動4表面上已經被提交,但由于第三層事務回退,從而導致所有它里面的事務都被回退。
十、重視數據形狀
我要為你介紹的最后一則技巧是不要輕視Microsoft Data Shaping Service for OLE DB的力量。Data shaping(數據形狀)允許你聚合多個SQL語句,構造出層次型的記錄集。在層次型記錄集中,單個字段能夠指向整個子記錄集。
例如,如果有兩個來自Biblio數據庫的表Publishers和Titles(Biblio數據庫是Microsoft的一個示例,可以從這里
下載),你可以按照下面介紹的方式構造SQL命令,把它們連接到一個記錄集。
SELECT Publishers.Name, Titles.Title
FROM Publishers
INNER JOIN Titles ON
Publishers.PubID=Titles.PubID
ORDER BY Publishers.Name, Titles.Title;
前面幾個記錄如下所示:
Name (Pub) Title
-------------- -----------------------------
A K PETERS A Physical Approach to Col...
A K PETERS Colour Principles for C...
A SYSTEM PUBNS C Plus Plus Reference Card
A SYSTEM PUBNS C Reference Card
AA BALKEMA Planning With Linear Progr...
AARP Thesaurus of Aging Termin...
ABACUS Access 2.0 Programming Bible
ABACUS Advanced Access Programming
可以看到,這個記錄集中存在大量的重復數據。利用數據形狀技術,我們能夠極大地減小結果數據的規模大小。下面的表被發送到客戶端,并傳遞給數據形狀游標服務。
Name (Publisher)
------------------------------------
A K PETERS
A SYSTEM PUBNS
AA BALKEMA
AARP
ABACUS
Title
------------------------------------
A Physical Approach to Color...
Colour Principles for Computer...
C Plus Plus Reference Card
C Reference Card
Planning With Linear Programming
Thesaurus of Aging Terminology : ...
Access 2.0 Programming Bible
Advanced Access Programming
在數據形狀游標服務中,這兩個表通過Chapters字段類型連接成一個層次結構,Chapters字段類型用來訪問子記錄集。
Dim con As ADODB.Connection
Dim rstPubs As ADODB.Recordset
Dim rstTitles As ADODB.Recordset
Dim sShape As String
Set con = New ADODB.Connection
Set rstPubs = New ADODB.Recordset
con.Provider = "MSDataShape"
con.Open "Data Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=Biblio.mdb;"
sShape = "SHAPE {SELECT Name, PubID " _
& " FROM Publishers} " _
& " APPEND ({SELECT Title, PubID " _
& " FROM Titles} " _
& " As PubTitles " _
& " RELATE PubID TO PubID) "
rstPubs.Open sShape, con
Do Until (rstPubs.EOF)
Debug.Print rstPubs!Name
Set rstTitles = rstPubs("PubTitles").Value
Do Until (rstTitles.EOF)
Debug.Print " " & rstTitles!Title
rstTitles.MoveNext
Loop
rstPubs.MoveNext
Loop
rstPubs.Close
con.Close
Set rstPubs = Nothing
Set con = Nothing
運行上面的代碼時,我們將看到如下輸出:
A K PETERS
A Physical Approach to Color...
Colour Principles for Computer...
A SYSTEM PUBNS
C Plus Plus Reference Card
C Reference Card
AA BALKEMA
Planning With Linear Programming
AARP
Thesaurus of Aging Terminology : ...
ABACUS
Access 2.0 Programming Bible
Advanced Access Programming
可以看到,數據形狀的功能非常強大。
原文轉自:http://www.kjueaiud.com