• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>