學習研究
 軟件技術
 營銷課堂
 企業管理
 
 
 當前位置:首頁 > 研究學習 > 軟件技術
 
         用ADO進行數據庫編程  

1 概述
  ADO是ActiveX數據對象(ActiveX Data Object),這是Microsoft開發數據庫應用程序的面向對象的新接口。ADO訪問數據庫是通過訪問OLE DB數據提供程序來進行的,提供了一種對OLE DB數據提供程序的簡單高層訪問接口。ADO技術簡化了OLE DB的操作,OLE DB的程序中使用了大量的COM接口,而ADO封裝了這些接口。所以,ADO是一種高層的訪問技術。
  ADO技術基于通用對象模型(COM),它提供了多種語言的訪問技術,同時,由于ADO提供了訪問自動化接口,所以,ADO可以用描述的腳本語言來訪問VBScript,VCScript等。
2 在VC中使用ADO
  可以使用VC6提供的ActiveX控件開發應用程序,還可以用ADO對象開發應用程序。使ADO對象開發應用程序可以使程序開發者更容易地控制對數據庫的訪問,從而產生符合用戶需求的數據庫訪問程序。
  使用ADO對象開發應用程序也類似其它技術,需產生與數據源的連接,創建記錄等步驟,但與其它訪問技術不同的是,ADO技術對對象之間的層次和順序關系要求不是太嚴格。在程序開發過程中,不必選建立連接,然后才能產生記錄對象等?梢栽谑褂糜涗浀牡胤街苯邮褂糜涗泴ο,在創建記錄對象的同時,程序自動建立了與數據源的連接。這種模型有力的簡化了程序設計,增強了程序的靈活性。下面講述使用ADO對象進行程序設計的方法。
  1)引入ADO庫文件
    使用ADO前必須在工程的stdafx.h文件里用直接引入符號#import引入ADO庫文件,以  使編譯器能正確編譯。代碼如下所示:
    #define INITGUID
    #import "c:\program files\common files\system\ado\msado15.dll"no_namespace     rename("EOF","EndOfFile")
    #include "icrsint.h"
    這行語句聲明在工程中使用ADO,但不使用ADO的名字空間,并且為了避免沖突,將  EOF改名為EndOfFile。
  2)初始化ADO環境
    在使用ADO對象之前必須先初始化COM環境。初始化COM環境可以用以下代碼完成:
    ::CoInitialize(NULL);
    在初始化COM環境后,就可以使用ADO對象了,如果在程序前面沒有添加此代碼,將會  產生COM錯誤。
    在使用完ADO對象后,需要用以下的代碼將初始化的對象釋放:
     ::CoUninitialize();
    此函數清除了為ADO對象準備的COM環境。
  3)接口簡介
    ADO庫包含三個基本接口:
    __ConnectionPtr接口、
    __CommandPtr接口、
    __RecordsetPtr接口、
    __ConnectionPtr接口返回一個記錄集或一個空指針。通常使用它來創建
    一個數據連接或執行一條不返回任何結果的SQL語句,如一個存儲過程。用    __ConnectionPtr接口返回一個記錄集不是一個好的使用方法。通常同 CDatabase一樣  ,使用它創建一個數據連接,然后使用其它對象執行數據輸入輸出操作。
   __CommandPtr接口返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的存儲  過程和SQL語句。在使用__CommandPtr接口時, 可以利用全局__ConnectionPtr接口,也可  以在__CommandPtr接口里直接使用連接串。如果只執行一次或幾次數據訪問操作,后者是  比較好的選擇。但如果要頻繁訪問數據庫,并要返回很多記錄集,那么,應該使用全局   __ConnectionPtr接口創建一個數據連接,然后使用__CommandPtr接口執行存儲過程和  SQL語句。
   __RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控  制功能,如記錄鎖定,游標控制等。同__CommandPtr接口一樣,它不一定要使用一個已經  創建的數據連接,可以用一個連接串代替連接指針賦給_RecordsetPtr的connection成員變  量,讓它自己創建數據連接。如果要使用多個記錄集,最好的方法是同Command對象一樣使  用已經創建了數據連接的全局—ConnectionPtr接口,然后使用__Recordse7tPtr執行存儲  過程和SQL語句。
  4)使用ADO訪問數據庫
    __ConnectionPtr是一個連接接口,首先創建一個__ConnectionPtr接口實例,接著指向   并打開一個ODBC數據源或OLE DB數據提供者(Provider)。以下代碼分別創建一個基于DSN和  非DSN的數據連接。
    //使用__ConnectionPtr(基于DSN)
     __ConnectionPtr MyDb;
     MyDb.CreateInstance(__uuidof(Connection));
     MyDb-〉Open("DSN=samp;UID=admin;PWD=admin","","",-1);
     //使用—ConnectionPtr (基于非DSN)
        __ConnectionPtr MyDb;
     MyDb.CreateInstance(__uuidof(Connection));
    MyDb.Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin;
    PWD=admin","","",-1);

    //使用__RecordsetPtr執行SQL語句
    __RecordsetPtr MySet;
    MySet.CreateInstance(__uuidof(Recordset));
   MySet-〉Open("SELECT * FROM some__table",  MyDb.GetInterfacePtr(),
   adOpenDynamic,adLockOptimistic,adCmdText);
     現在我們已經有了一個數據連接和一個記錄集,接下來就可以使用數據了。從以下   代碼可以看到,使用ADO的__RecordsetPtr接口,就不需要像DAO那樣頻繁地使用大而復   雜的數據結構VARIANT,并強制轉換各種數據類型了,這也是ADO的優點之一。假定程序   有一個名稱為m__List的ListBox控件,下面代碼我們
   用__RecordsetPtr接口獲取記錄集數據并填充這個ListBox控件:
   __variant__t Holder
   try{while(!MySet-〉adoEOF)
   { Holder = MySet-〉GetCollect("FIELD__1");
   if(Holder.vt!=VT__NULL)
   m__List.AddString((char)__bstr__t(Holder));
   MySet-〉MoveNext();} }
   catch(__com__error  e)
   { CString Error = e-〉ErrorMessage();
   AfxMessageBox(e-〉ErrorMessage());
   } catch(...)
   { MessageBox("ADO發生錯誤!");}

     必須始終在代碼中用try和catch來捕獲ADO錯誤,否則ADO錯誤會使你的應用程序崩潰    。當ADO發生運行錯誤時(如數據庫不存在),OLE DB數據提供者將自動創建一個   __com__error對象,并將有關錯誤信息填充到這個對象的成員變量。
  5)類型轉換
    由于COM對象是跨平臺的,它使用了一種通用的方法來處理各種類型的數據,因此  CString 類和COM對象是不兼容的,我們需要一組API來轉換COM對象和 C++類型的數據! _vatiant__t和__bstr__t就是這樣兩種對象。它們提供了 通用的方法轉換COM對象和C+ 。愋偷臄祿。
  6)在VB中使用ADO
   ADO 提供執行以下操作的方式:
   1、連接到數據源。同時,可確定對數據源的所有更改是否已成功或沒有發生。
   2、指定訪問數據源的命令,同時可帶變量參數,或優化執行。
   3、執行命令。
   4、如果這個命令使數據按表中的行的形式返回,則將這些行存儲在易于檢查、操作或更    改的緩存中。
   5、適當情況下,可使用緩存行的更改內容來更新數據源。
   6、提供常規方法檢測錯誤(通常由建立連接或執行命令造成)。
     在典型情況下,需要在編程模型中采用所有這些步驟。但是,由于 ADO有很強的靈活   性,所以最后只需執行部分模塊就能做一些有用的工作。
   以下元素是 ADO 編程模型中的關鍵部分:
  7)連接
    通過“連接”可從應用程序訪問數據源,連接是交換數據所必需的環境。對象模型使  用 Connection 對象使連接概念得以具體化!笆聞铡庇糜诮缍ㄔ谶B接過程中發生的一系  列數據訪問操作的開始和結束。ADO 可明確事務中的操作造成的對數據源的更改或者成功  發生,或者根本沒有發生。如果取消事務或它的一個操作失敗,則最終的結果將仿佛是事  務中的操作均未發生,數據源將會保持事務開始以前的狀態。對象模型無法清楚地體現出  事務的概念,而是用一組 Connection 對象方法來表示。ADO 從 OLE DB 提供者訪問數據  和服務。Connection 對象用于指定專門的提供者和任意參數。

  8)命令
    通過已建立的連接發出的“命令”可以某種方式來操作數據源。一般情況下,命令可  以在數據源中添加、刪除或更新數據,或者在表中以行的格式檢索數據。對象模型用   Command 對象來體現命令概念。使用 Command 對象可使ADO 優化命令的執行。
  1、參數
    通常,命令需要的變量部分即“參數”可以在命令發布之前進行更改。例如,可重復  發出相同的數據檢索命令,但每一次均可更改指定的檢索信息。參數對與函數活動相同的  可執行命令非常有用,這樣就可知道命令是做什么,但不必知道它如何工作。例如,可發  出一項銀行過戶命令,從一方借出貸給另一方?蓪⒁^戶的款額設置為參數。對象模型  用 Parameter 對象來體現參數概念。
  2、記錄集
    如果命令是在表中按信息行返回數據的查詢(行返回查詢),則這些行將會存儲在本  地。對象模型將該存儲體現為 Recordset 對象。但是,不存在僅代表單獨一個Recordset   行的對象。
    記錄集是在行中檢查和修改數據最主要的方法。
  3、字段
    一個記錄集行包含一個或多個“字段”。如果將記錄集看作二維網格,字段將排列構  成“列”。每一字段(列)都分別包含有名稱、數據類型和值的屬性,正是在該值中包含  了來自數據源的真實數據。對象模型以 Field 對象體現字段。
    要修改數據源中的數據,可在記錄集行中修改 Field 對象的值,對記錄集的更改最終  被傳送給數據源。作為選項,Connection 對象的事務管理方法能夠可靠地保證更改要么全  部成功,要么全部失敗。
  4、錯誤
    錯誤隨時可在應用程序中發生,通常是由于無法建立連接、執行命令或對某些狀態(  例如,試圖使用沒有初始化的記錄集)的對象進行操作。對象模型以Error 對象體現錯誤  。任意給定的錯誤都會產生一個或多個 Error 對象,隨后產生的錯誤將會放棄先前的   Error 對象組。
  5、屬性
    每個 ADO 對象都有一組唯一的“屬性”來描述或控制對象的行為。屬性有內置和動態  兩種類型。內置屬性是 ADO 對象的一部分并且隨時可用。動態屬性則由特別的數據提供者  添加到 ADO 對象的屬性集合中,僅在提供者被使用時才能存在。對象模型以 Property 對  象體現屬性。
  6、集合
    ADO 提供“集合”,這是一種可方便地包含其他特殊類型對象的對象類型。使用集合  方法可按名稱(文本字符串)或序號(整型數)對集合中的對象進行檢索。
    ADO 提供四種類型的集合:Connection 對象具有 Errors 集合,包含為響應與數據源  有關的單一錯誤而創建的所有 Error 對象。Command 對象具有 Parameters 集合,包含應   用于 Command 對象的所有Parameter對象。Recordset 對象具有 Fields 集合,包含所有  定義 Recordset 對象列的 Field 對象。
    此外,Connection、Command、Recordset 和 Field 對象都具有Properties 集合。它  包含所有屬于各個包含對象的 Property 對象。ADO 對象擁有可在其上使用的諸如“整型  ”、“字符型”或“布爾型”這樣的普通數據類型來設置或檢索值的屬性。然而,有必要  將某些屬性看成是數據類型“COLLECTION OBJECT”的返回值。相應的,集合對象具有存儲  和檢索適合該集合的其他對象的方法。
  7、事件
   ADO 2.0 支持事件,事件是對某些操作將要或已經發生的通知。
   有兩類事件:ConnectionEvent 和 RecordsetEvent。Connection 對象產生
   ConnectionEvent 事件,而 Recordset 對象則產生 RecordsetEvent 事件。
   事件由事件處理程序例程處理,該例程在某個操作開始之前或結束之后被調用。
   某些事件是成對出現的。開始操作前調用的事件名格式為 WillEvent(Will 事件),
   而操作結束后調用的事件名格式為 EventComplete(Complete 事件)。
   其余的不成對事件只在操作結束后發生。(其名稱沒有任何固定模式。)事件
   處理程序由狀態參數控制。附加信息由錯誤和對象參數提供。
   可以請求事件處理程序不接受第一次通知以后的任何通知。例如,可以選擇只
   接收 Will 事件或 Complete 事件。
   下面的代碼顯示了一個使用ADO的例子。
   首先加入Microsoft ActiveX Data Object 2.0 Library引用。
   Dim db As Connection
   Set db = New Connection
   db.CursorLocation = adUseClient
   db.Open "PROVIDER=MSDASQL;DSN=TestDatabase", "sa", "", -1
   Dim i As Long
   Dim id As Long
   Dim value As Single
   Dim rst As New Recordset
   Set rst = New Recordset
   rst.Open "select * from 模擬量變化歷史?quot;, db, adOpenDynamic,    adLockOptimistic
   rst.MoveFirst
   For i = 0 To rst.RecordCount - 1
   id = rst.Fields("ID")
   value=rst.Fields(“VALUE”)
   rst.MoveNext
   Next i
   rst.Close
   Set rst = Nothing 
   db.Close

     ADO技術是訪問數據庫的新技術,具有易于使用、訪問靈活、應用廣泛的
   特點。用ADO訪問數據源的特點可總結如下:
   1、 易于使用
      這是ADO技術的最重要的一個特征。由于ADO是高層應用,所以相對于OLE DB或者   ODBC來說,它具有面向對象的特性。同時,在ADO的對象結構中,其對象之間的層次關系   并不明顯。相對于DAO等訪問技術來講,又不必關心對象的構造順序和構造層次。對于要   用的對象,不必選建立連接、會話等對象,只需直接構造即可,方便了應用程序的編制
   2、 高速訪問數據源
      由于ADO技術基于OLE DB,所以,它也繼承了OLE DB訪問數據庫的高速性。
   3、 可以訪問不同數據源
      ADO技術可以訪問包括關系數據庫和非關系數據庫的所有文件系統。此特點使應用   程序有很多的靈活性和通用性。
   4、 可以用于Microsoft ActiveX頁
      ADO技術可以以ActiveX控件的形式出現,所以,可以被用于Microsoft ActiveX頁   ,此特征可簡化WEB頁的編程。
   5、 程序占用內存少
      由于ADO是基于組件對象模型(COM)的訪問技術,所以,用ADO產生的應用程序占    用內存少。
   總結
      要在訪問數據時判斷出應該使用哪一種技術,這并不容易?赡苄枰脤嵱贸绦颉  硖幚矶鄠數據庫類型;部分數據可能出現在本地硬盤驅動器上,部分在網絡上,還有   一部分在主機上。甚至客戶安裝在設備上的產品也會使這種選擇更加困難。例如,你所   期待的ODBC支持級別也許依賴于所安裝的Microsoft Office的版本,因為這個產品不提   供ODBC支持。你還會發現,ADO類提供的對象和方法要比ODBC類多!    
     ADO可以提供程序中絕對必須具有的一些特性棗例如,你會發現OLE-DB和ADO兩者都   支持DFX_Currency,但在ODBC中沒有對應的功能,但你要想掌握它們也必須付出一定的   努力。
     選擇OLE-DB或ODBC時,有幾條一般的規則。因為ADO實際上只是OLE-DB的包裝,所以   這些規則也適用于它。下面提供一些基本的原則,可以用來幫助你決定選擇OLE-DB還是   ODBC。
     非OLE環境 如果要訪問支持ODBC的數據庫,而該數據庫又在不支持OLE的服務器上,   那么ODBC是最好的選擇。
     非SQL環境 ODBC在處理SQL時非常出眾。處理非SQL數據庫時,OLE-DB則具有非常明   顯的優勢。
     OLE環境 對支持OLE的服務器來說,選擇OLE-DB還是ODBC也許是希望各半。如果有   ODBC驅動程序可供利用,那么使用ODBC是一個好主意;否則,就只有選擇OLE-DB了。
     所需的互操作性 如果需要可互操作的數據庫部件,那么只有選擇OLE-DB。


                                回到頂部

               北京中普友通軟件技術有限公司版權所有 copyright 2002-2004
老葡京注册开户