當前位置:編程學習大全網 - 熱門推薦 - 用Visual C++開發數據庫應用程序(3)

用Visual C++開發數據庫應用程序(3)

6、使用ADO

6.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等。

6.2 在VC中使用ADO

可以使用VC6提供的ActiveX控件開發應用程序,還可以用ADO對象開發應用程序。使用ADO對象開發應用程序可以使程序開發者更容易地控制對數據庫的訪問,從而產生符合用戶需求的數據庫訪問程序。

使用ADO對象開發應用程序也類似其它技術,需產生與數據源的連接,創建記錄等步驟,但與其它訪問技術不同的是,ADO技術對對象之間的層次和順序關系要求不是太嚴格。在程序開發過程中,不必選建立連接,然後才能產生記錄對象等。可以在使用記錄的地方直接使用記錄對象,在創建記錄對象的同時,程序自動建立了與數據源的連接。這種模型有力的簡化了程序設計,增強了程序的靈活性。下面講述使用ADO對象進行程序設計的方法。

6.21 引入ADO庫文件

使用ADO前必須在工程的stdafx.h文件裏用直接引入符號#import引入ADO庫文件,以使編譯器能正確編譯。代碼如下所示:

#define INITGUID

#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","EndOfFile")

#include "icrsint.h"

這行語句聲明在工程中使用ADO,但不使用ADO的名字空間,並且為了避免沖突,將EOF改名為EndOfFile。

6.22 初始化ADO環境

在使用ADO對象之前必須先初始化COM環境。初始化COM環境可以用以下代碼完成:

在初始化COM環境後,就可以使用ADO對象了,如果在程序前面沒有添加此代碼,將會產生COM錯誤。

在使用完ADO對象後,需要用以下的代碼將初始化的對象釋放:

此函數清除了為ADO對象準備的COM環境。

6.23 接口簡介

ADO庫包含三個基本接口:

__ConnectionPtr接口、

__CommandPtr接口、

__RecordsetPtr接口,

__ConnectionPtr接口返回壹個記錄集或壹個空指針。通常使用它來創建壹個數據連接或執行壹條不返回任何結果的SQL語句,如壹個存儲過程。用__ConnectionPtr接口返回壹個記錄集不是壹個好的使用方法。通常同CDatabase壹樣,使用它創建壹個數據連接,然後使用其它對象執行數據輸入輸出操作。

__CommandPtr接口返回壹個記錄集。它提供了壹種簡單的方法來執行返回記錄集的存儲過程和SQL語句。在使用__CommandPtr接口時,可以利用全局__ConnectionPtr接口,也可以在__CommandPtr接口裏直接使用連接串。如果只執行壹次或幾次數據訪問操作,後者是比較好的選擇。但如果要頻繁訪問數據庫,並要返回很多記錄集,那麽,應該使用全局__ConnectionPtr接口創建壹個數據連接,然後使用__CommandPtr接口執行存儲過程和SQL語句。

__RecordsetPtr是壹個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同__CommandPtr接口壹樣,它不壹定要使用壹個已經創建的數據連接,可以用壹個連接串代替連接指針賦給__RecordsetPtr的connection成員變量,讓它自己創建數據連接。如果要使用多個記錄集,最好的方法是同Command對象壹樣使用已經創建了數據連接的全局—ConnectionPtr接口,然後使用__Recordse7tPtr執行存儲過程和SQL語句。

6、24 使用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對象,並將有關錯誤信息填充到這個對象的成員變量。

6.25 類型轉換

由於COM對象是跨平臺的,它使用了壹種通用的方法來處理各種類型的數據,因此CString 類和COM對象是不兼容的,我們需要壹組API來轉換COM對象和C++類型的數據。__vatiant__t和__bstr__t就是這樣兩種對象。它們提供了通用的方法轉換COM對象和C++類型的數據。

6.3 在VB中使用ADO

ADO 提供執行以下操作的方式:

1、連接到數據源。同時,可確定對數據源的所有更改是否已成功或沒有發生。

2、指定訪問數據源的命令,同時可帶變量參數,或優化執行。

3、執行命令。

3、如果這個命令使數據按表中的行的形式返回,則將這些行存儲在易於檢查、操作或更改的緩存中。

4、適當情況下,可使用緩存行的更改內容來更新數據源。

5、提供常規方法檢測錯誤(通常由建立連接或執行命令造成)。

在典型情況下,需要在編程模型中采用所有這些步驟。但是,由於 ADO 有很強的靈活性,所以最後只需執行部分模塊就能做壹些有用的工作。

以下元素是 ADO 編程模型中的關鍵部分:

6.31 連接

通過“連接”可從應用程序訪問數據源,連接是交換數據所必需的環境。對象模型使用 Connection 對象使連接概念得以具體化。

“事務”用於界定在連接過程中發生的壹系列數據訪問操作的開始和結束。ADO 可明確事務中的操作造成的對數據源的更改或者成功發生,或者根本沒有發生。如果取消事務或它的壹個操作失敗,則最終的結果將仿佛是事務中的操作均未發生,數據源將會保持事務開始以前的狀態。對象模型無法清楚地體現出事務的概念,而是用壹組 Connection 對象方法來表示。ADO 從 OLE DB 提供者訪問數據和服務。Connection 對象用於指定專門的提供者和任意參數。

6.32 命令

通過已建立的連接發出的“命令”可以某種方式來操作數據源。壹般情況下,命令可以在數據源中添加、刪除或更新數據,或者在表中以行的格式檢索數據。對象模型用 Command 對象來體現命令概念。使用 Command 對象可使 ADO 優化命令的執行。

參數

通常,命令需要的變量部分即“參數”可以在命令發布之前進行更改。例如,可重復發出相同的數據檢索命令,但每壹次均可更改指定的檢索信息。

參數對與函數活動相同的可執行命令非常有用,這樣就可知道命令是做什麽的,但不必知道它如何工作。例如,可發出壹項銀行過戶命令,從壹方借出貸給另壹方。可將要過戶的款額設置為參數。

對象模型用 Parameter 對象來體現參數概念。

6.33 記錄集

如果命令是在表中按信息行返回數據的查詢(行返回查詢),則這些行將會存儲在本地。

對象模型將該存儲體現為 Recordset 對象。但是,不存在僅代表單獨壹個 Recordset 行的對象。

記錄集是在行中檢查和修改數據最主要的方法。

6.34 字段

壹個記錄集行包含壹個或多個“字段”。如果將記錄集看作二維網格,字段將排列構成“列”。每壹字段(列)都分別包含有名稱、數據類型和值的屬性,正是在該值中包含了來自數據源的真實數據。

對象模型以 Field 對象體現字段。

要修改數據源中的數據,可在記錄集行中修改 Field 對象的值,對記錄集的更改最終被傳送給數據源。作為選項,Connection 對象的事務管理方法能夠可靠地保證更改要麽全部成功,要麽全部失敗。

6.35 錯誤

錯誤隨時可在應用程序中發生,通常是由於無法建立連接、執行命令或對某些狀態(例如,試圖使用沒有初始化的記錄集)的對象進行操作。

對象模型以 Error 對象體現錯誤。

任意給定的錯誤都會產生壹個或多個 Error 對象,隨後產生的錯誤將會放棄先前的 Error 對象組。

6.36 屬性

每個 ADO 對象都有壹組唯壹的“屬性”來描述或控制對象的行為。

屬性有內置和動態兩種類型。內置屬性是 ADO 對象的壹部分並且隨時可用。動態屬性則由特別的數據提供者添加到 ADO 對象的屬性集合中,僅在提供者被使用時才能存在。

對象模型以 Property 對象體現屬性。

6.37 集合

ADO 提供“集合”,這是壹種可方便地包含其他特殊類型對象的對象類型。使用集合方法可按名稱(文本字符串)或序號(整型數)對集合中的對象進行檢索。

ADO 提供四種類型的集合:

Connection 對象具有 Errors 集合,包含為響應與數據源有關的單壹錯誤而創建的所有 Error 對象。

Command 對象具有 Parameters 集合,包含應用於 Command 對象的所有 Parameter 對象。

Recordset 對象具有 Fields 集合,包含所有定義 Recordset 對象列的 Field 對象。

此外,Connection、Command、Recordset 和 Field 對象都具有 Properties 集合。它包含所有屬於各個包含對象的 Property 對象。

ADO 對象擁有可在其上使用的諸如“整型”、“字符型”或“布爾型”這樣的普通數據類型來設置或檢索值的屬性。然而,有必要將某些屬性看成是數據類型“COLLECTION OBJECT”的返回值。相應的,集合對象具有存儲和檢索適合該集合的其他對象的方法。

6.38 事件

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 模擬量變化歷史表", 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

6.4總結

ADO技術是訪問數據庫的新技術,具有易於使用、訪問靈活、應用廣泛的特點。用ADO訪問數據源的特點可總結如下:

易於使用

這是ADO技術的最重要的壹個特征。由於ADO是高層應用,所以相對於OLE DB或者ODBC來說,它具有面向對象的特性。同時,在ADO的對象結構中,其對象之間的層次關系並不明顯。相對於DAO等訪問技術來講,又不必關心對象的構造順序和構造層次。對於要用的對象,不必選建立連接、會話等對象,只需直接構造即可,方便了應用程序的編制。

高速訪問數據源

由於ADO技術基於OLE DB,所以,它也繼承了OLE DB訪問數據庫的高速性。

可以訪問不同數據源

ADO技術可以訪問包括關系數據庫和非關系數據庫的所有文件系統。此特點使應用程序有很多的靈活性和通用性。

可以用於Microsoft ActiveX頁

ADO技術可以以ActiveX控件的形式出現,所以,可以被用於Microsoft ActiveX頁,此特征可簡化WEB頁的編程。

程序占用內存少

由於ADO是基於組件對象模型(COM)的訪問技術,所以,用ADO產生的應用程序占用內存少。

7、總結

要在訪問數據時判斷出應該使用哪壹種技術,這並不容易。可能需要公用實用程序來處理多個數據庫類型;部分數據可能出現在本地硬盤驅動器上,部分在網絡上,還有壹部分在主機上。甚至客戶安裝在設備上的產品也會使這種選擇更加困難。例如,妳所期待的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。

  • 上一篇:框架的解釋框架的解釋是什麽
  • 下一篇:xp全功能美化版下載
  • copyright 2024編程學習大全網