2015年12月3日 星期四

ODBC OLEDB ADO ADOX 的關係

ODBC OLEDB ADO ADOX 的關係如下:

ODBC( Open Database Connectivity)
OLEDB(Object Linking and Embedding, Database ; OLE-DB)
ADO(ActiveX Data Objects) 
ADOX(ADO Ext 2.1)   

1.四者的關係:
ODBC:最早資料庫通信標準
OLEDB: 在一切物件化的趨勢下,ms打算用它取代ODBC
OLEDB分兩種:
    a. 直接的OLEDB
    b. 類似ODBC的OLEDB(架構在ODBC上),這樣沒有自己的OLEDB提供者的資料庫也可以使用OLEDB的特點了。

ADO:其實只是一個應用程式層次的介面,它用OLEDB來與資料庫交換資料。
ADOX:對ADO的安全性,維護性(如:創建一個資料庫)進行了擴展。

2.用ODBC連接資料庫:
ODBC中提供三種dsn,它們的區別很簡單:使用者dsn只能用於本使用者。系統dsn和檔dsn的區別只在於連接資訊的存放位置不同:系統dsn存放在ODBC儲存區裡,而檔dsn則放在一個文字檔中。
它們的創建方法就不說了。在asp中使用它們時,寫法如下:
A. SQL server:
用系統dsn: connstr="DSN=dsnname; UID=xx; PWD=xxx;DATABASE=dbname"
用檔dsn: connstr="FILEDSN=xx;UID=xx; PWD=xxx;DATABASE=dbname"
還可以用連接字串(從而不用再建立dsn):
connstr="DRIVER={SQL SERVER};SERVER=servername;UID=xx;PWD=xxx"
B. access:
用系統dsn: connstr="DSN=dsnname"
(或者為:connstr="DSN=dsnname;UID=xx;PWD=xxx")
用檔dsn: connstr="FILEDSN=xx"
還可以用連接字串(從而不用再建立dsn):
connstr="DRIVER={Microsoft Access Driver};DBQ=d:\abc\abc.mdb"


3.用OLEDB連接資料庫:
A. sql server:
connstr="PROVIDER=SQLOLEDB;
DATA SOURCE=servername;UID=xx;PWD=xxx;DATABASE=dbname"
B. access:
connstr="PROVICER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\abc\abc.mdb"
4.使用UDL檔:
UDL檔是用來存放資料庫連接資訊的一個文字檔,有點象檔DSN,不過UDL是針對OLEDB(直接的和面向ODBC的)的。
UDL的創建方法:
右擊桌面或資源管理器-》新建-》microsoft資料連線, 其中的設置工作應該比較清楚了。
UDL的用法:
connstr="file name=e:\abc\abc.udl"
OLEDB的性能比較
有許多種辦法可以連上一個資料庫. 你可以用System DSN, DSN-less連接或是本地的OLEDB provider. OLEDB? 這是什麼什麼玩藝兒? 也許你們中的許多人以前沒有聽說過. 要回答這個問題,我們先得回顧一下資料庫連接的歷史.
早期的資料庫連接是非常困難的. 每個資料庫的格式都不一樣,開發者得對他們所開發的每種資料庫的底層API有深刻的瞭解. 因此,能處理各種各樣資料庫的通用的API就應運而生了. 也就是現在的ODBC(Open Database Connectivity), ODBC是人們在創建通用API的早期產物. 有許多種資料庫遵從了這種標準,被稱為ODBC相容的資料庫.
ODBC相容的資料庫包括Access, MS-SQL Server, Oracle, Informix等.
但ODBC並不是無瑕疵地的,它仍然含有大量的低級的調用,開發ODBC應用程式仍較困難. 開發者不得不將大量的精力花在底層的資料庫通信中,而不能專注于他們所要處理的資料. 後來微軟提出了一個解決方案: DAO(Data Access Objects). DAO的代碼看起來象這樣:
objItem.AddNew
objItem.Name = "Chair"
objItem.Price = 10
objItem.Update
你也許看過DAO的代碼. 後來DAO演變為RDO(Remote Data Objects, 為分散式資料庫體系設計), 再後來是ADO. 儘管它們都有各自的不足之處. 根據微軟的說法,"ODBC提供了本地SQL資料的存取,DAO提供了高級的資料物件". DAO和RDO都需要資料以SQL(Structured Query Language)的格式存儲. 針對這些缺陷,微軟提出了OLEDB,一個基於COM的資料存儲物件,能提供對所有類型的資料的操作,甚至能在離線的情況下存取資料(比方說,你使用的是你的便攜機,你可以毫不費力地看到最後一次資料同步時的資料映射).

OLEDB位於ODBC層與應用程式之間. 在你的ASP頁面裡,ADO是位於OLEDB之上的"應用程式". 你的ADO調用先被送到OLEDB,然後再交由ODBC處理. 你可以直接連接到OLEDB層,如果你這麼做了,你將看到伺服器端游標(recordset的游標)性能的提升. 那我們該如何直接連接到OLEDB呢?

要想直接連到OLEDB層,你必須改變你的connection物件連接字串. 先用老辦法創建一個connectiong物件:
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")

接下去,我們不用常規的類似
  DSN=pubs or DRIVER={MS SQL-Server};
  UID=sa;
  PWD=;
  DATABASE=pubs;
  SERVER=myMachine的連接語法,

而採用下面的連接語法:

  objConn.ConnectionString = "Provider=ProviderName; 
  DataSource=DatabaseSource; 
  Initial Catalog=DatabaseName; 
  User ID=UserID;
  Password=Password"

對於SQL:
ProviderName = SQLOLEDB
Data Source = Server Name
Initial Catalog = Database Name

對於Access:
ProviderName = Microsoft.Jet.OLEDB.3.51
Data Source = Full path to .MDB file
下面讓我們來看兩個例子,一個是針對Access的,還有一個是針對SQL的. 如果你的連接SQL的DSN-less連接串是這樣的:
DRIVER={MS SQL-Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine

那麼直接連接到OLEDB的連接字串應該是這樣的:
Provider=SQLOLEDB; 
Data Source=myMachine; 
Initial Catalog=pubs; User
ID=sa; 
Password=

讓我們來看看Access,如果你的Access的連接字串是:
DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=c:\inetpub\wwwroot\users.mdb

那麼直接連接到OLEDB的連接字串應該是這樣的:
Provider=Microsoft.Jet.OLEDB.3.51; Data
Source=c:\inetpub\wwwroot\users.mdb

就是這麼簡單,挺棒的吧?
這很重要嗎?
現在你也許對為什麼要學習這種新的資料庫連接方法感到有些兒迷惑,為什麼不走標準的DSN-less/System DSN路子呢? 讓我來告訴你為什麼. 據Wrox出的ADO 2.0
Programmer's Reference一書中的測試,用OLEDB連接而不是DSN或DSN-less的連接會得到的性能提升如下:
性能比較
SQL Access
OLEDB DSN OLEDB DSN
Connection Times: 18 82 Connection Times: 62 99
Iterating through 1,000 Records Times: 2900 5400 Iterating through
1,000 Records Times: 100 950
一、ADO 和 RDO、DAO 的比較
ADO 並不是自動和您現存的資料訪問應用程式代碼相容的。當 ADO 封裝 DAO 和 RDO 的功能性的時候,就必須將許多語言要素轉換為 ADO 語法。在某些情況下,您可以將現存代碼的某些功能做一個簡單轉換。在其他情況下,最好是用 ADO 的新功能重寫該應用程式。

DAO (Data Access Objects) 資料訪問物件是第一個物件導向的介面,它顯露了 Microsoft Jet 資料庫引擎(由 Microsoft Access 所使用),並允許 Visual Basic 開發者通過 ODBC 象直接連接到其他資料庫一樣,直接連接到 Access 表。DAO 最適用於單機系統應用程式或小範圍本地分佈使用。
RDO (Remote Data Objects) 遠端資料物件是一個到 ODBC 的、物件導向的資料訪問介面,它同便於使用的 DAO style組合在一起,提供了一個介面,形式上展示出所有 ODBC 的底層功能和靈活性。儘管 RDO 在很好地訪問 Jet 或 ISAM 資料庫方面受到限制,而且它只能通過現存的 ODBC 驅動程式來訪問關係資料庫。但是,RDO 已被證明是許多 SQL Server、Oracle 以及其他大型關係資料庫開發者經常選用的最佳介面。RDO 提供了用來訪問預存程序和複雜結果集的更多和更複雜的物件、屬性,以及方法。
ADO 是 DAO/RDO 的後繼產物。ADO 2.0在功能上與 RDO 更相似,而且一般來說,在這兩種模型之間有一種相似的映射關係。ADO "擴展"了 DAO 和 RDO 所使用的物件模型,這意味著它包含較少的物件、更多的屬性、方法(和參數),以及事件。例如,ADO 沒有與 rdoEngine 和 rdoEnvironment 物件相等同的物件,可以顯露 ODBC 驅動程式管理器和 hEnv 介面。雖然您的介面可能是通過 ODBC OLE DB 服務提供程式實現的,但您當前也不能從 ADO 中創建 ODBC 資料來源。
包含在 DAO 和 RDO 模型中的許多功能被合併為單個物件,這樣就生成了一個簡單得多的物件模型。然而,由於這個原因,起初您可能會覺得找到合適的 ADO 物件、集合、屬性、方法,或事件非常困難。與 DAO 和 RDO不同的是,雖然 ADO 物件是分層結構的,但在分層結構範圍之外也是可以創建的。
不過,也應當注意,ADO 當前並不支援 DAO 的所有功能。ADO 主要包括 RDO 風格的功能性,以便和 OLE DB 資料來源交互,另外還包括遠端和 DHTML 技術。
一般說來,在 ADO 的演化過程中,馬上把大多數 DAO 應用程式移植到 ADO 上可能為時太早,因為當前的 ADO 並不支援資料定義 (DDL)、使用者、組,等等。不過,如果您只將 DAO 用於客戶-伺服器應用程式,而並不依賴于 Jet 資料庫引擎或不使用 DDL,那麼現在就可能移植到 ADO。最終,Microsoft 將提供一個 ADO DDL 部件來説明進行 DAO 到 ADO 的移植,並為 OLE DB 供應商提供一般的 DDL 支援。
二、ADO 2.0 物件模型
ADO 2.0 物件模型由八個物件組成的,它們中的大多數在功能上和 RDO 物件相似,只不過具有更強的功能性而已。需要花一些時間在 Object Browser (F2) 中流覽物件模型,以便於熟悉各種不同屬性、方法、事件、集合等等所在的位置。
注意 所有後面帶有星號 (*) 的物件都是同時應用於 ADO Recordset 型別程式庫 (ADOR) 的物件。
· Command 物件 包含關於某個命令,例如查詢字串、參數定義等的資訊。Command 物件在功能上和 RDO 的 rdoQuery 物件是相似的。
· Connection 物件 包含關於某個資料提供程式的資訊。Connection 物件在功能上和 RDO 的 rdoConnection 物件是相似的,並且包含了關於結構描述的資訊。它還包含某些 RDOEnvironment 物件的功能,例如 transaction 控制項。
· Error 物件 包含資料提供程式出錯時的擴展資訊。Error 物件在功能上和 RDO 的 rdoError 物件是相似的。
· Field 物件* 包含記錄集中資料的某單個列的資訊。Field 物件在功能上和 RDO 的 rdoColumn 物件是相似的。
· Parameter 物件 包含參數化的 Command 物件的某單個參數的資訊。該 Command 物件有一個包含其所有 Parameter 物件的 Parameters 集合。Parameter 物件在功能上和 RDO 的 rdoParameter 物件是相似的。
· Property 物件* 包含某個 ADO 物件的提供程式定義的特徵。沒有任何等同于該物件的 RDO,但 DAO 有一個相似的物件。ADO 物件可以具有兩種屬性:
· Built-In 屬性:ADO 的"本地"屬性。也就是說,任何使用熟悉的 MyObject.Property 語法的新物件都可以立即使用的 ADO 中的屬性。Built-in 屬性並不在某個物件的 Properties 集合中以 Property 物件的形式出現,因此儘管您可以修改它們的值,您卻不能修改它們的特性或將它們刪除。
· Dynamic 屬性:ADO 的非本地屬性,它們是由下一級資料提供程式定義的。它們出現在合適的 ADO 物件的 Properties 集合中。
例如,一個資料提供程式特有的屬性可能指明某個 Recordset 物件是支援事務還是支援更新。這些附加的屬性在 Recordset 的 Properties 集合中以 Property 物件的形式出現。Dynamic 屬性只能用 MyObject.Properties(0) 或 MyObject.Properties("Name") 語法通過集合來引用。不同的資料提供程式可能提供一個或多個特殊的屬性,來處理提供程式特有的操作。
· Recordset 物件* Recordset 物件包含某個查詢返回的記錄,以及那些記錄中的游標。Recordset 物件在功能上和 RDO 的 rdoResultset 物件相似。您可以在不用顯式地打開 Connection 物件的情況下,打開一個 Recordset(例如,執行一個查詢)。不過,如果您選擇創建一個 Connection 物件,您就可以在同一個連接上打開多個 Recordset 物件。
三、一般資料訪問的移植
下面列出了兩個基本的資料訪問方案,每個方案都在後面的主題中進行了討論。在每種方案中,都介紹了一種 RDO 解決方案和一種 ADO 解決方案。
· 建立到某個資料庫的連接
· 運行一個基本查詢
注意 部分示例引用了某個表單上的附加控制項,例如一個 MSHFlexGrid 控制項或 TextBox 控制項。為使自己的工程能夠正常工作,請把這些控制項添加到工程中。
1。建立到某個資料庫的連接
1.> RDO
要打開一個連接,必須提供一個帶參數的連接字串。注意當 RDO 要創建一個 rdoQuery 物件時,是不需要連接的,但當最初創建一個 rdoResultset 物件時,則是需要的:
Dim cn As New rdoConnection
Dim cnB As New rdoConnection
Const ConnectionString = "uid=myname;pwd=mypw;driver={SQLServer}; _
server=myserver;database=pubs;dsn=''"
該連接字串訪問一個特定的 SQL Server,並允許 ODBC 在沒有 DSN 的情況下打開一個連接。這是一個帶有所有標準參數的典型 ODBC 連接字串。
下一節代碼,在表單的 Load 事件中,建立了游標驅動程式的類型以及登錄超時。缺省情況下,RDO 使用 rdUseIfNeeded 游標類型,該類型調用 SQL Server 上伺服器端的游標。下面的示例中指定了 rdUseNone,從而使這種缺省規定不被遵守。rdDriverNoPrompt 標誌意味著如果使用者ID 和密碼不匹配,應用程式將產生一個錯誤。
Private Sub Form_Load()
With cn
cn.Connect = ConnectString
cn.LoginTimeout = 10
cn.CursorDriver = rdUseNone
cn.EstablishConnection rdDriverNoPrompt
End With
第二個連接執行任何客戶批次處理更新:
With cnB
cnB.Connect = ConnectString
cnB.CursorDriver = rdUseClientBatch
cnB.EstablishConnection
End With
End Sub
當連接操作完成時最後一個事件發生,並且它能夠對連接打開時所出現的任何錯誤進行處理。可以用該事件來測試連接是否正常工作,如果能正常工作,則使任何依賴于打開連接的按鈕都成為有效的。
Private Sub cn_Connect(ByVal ErrorOccurred As Boolean)
If ErrorOccurred Then
MsgBox "Could not open connection", vbCritical
Else
RunOKFrame.Enabled = True
End If
End Sub
2.>ADO
要在 ADO 中建立一個資料庫連接,首先創建一組可被 ADODB 物件引用的對象 ADO 物件。這些物件將在以後用於設置打開連接和generate結果集的特定屬性:
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cnB As New ADODB.Connection
Dim Qy As New ADODB.Command
下一行創建了一個連接字串,正如您在前一個 RDO 示例中所創建的那樣。在兩種情況下,您都使用 ODBC 的 "非-DSN" 連接策略以節省時間,並提高性能:
Const ConnectionString = "uid=myname;pwd=mypw;driver={SQL Server}; _
server=myserver;database=pubs;dsn=",,connection=adConnectAsync"
下面的聲明對本示例中用到的變數進行初始化。(注意一個保存結果集的變數陣列的創建):
Dim sql As String
Dim rc As Integer
Dim i As Integer
Dim Changes As Integer
Dim bms() As Variant

下一步,打開一個到 Form_Load 事件中某個資料庫的 ADO 連接。注意該代碼和 RDO 代碼是很相似的,只不過常數是以 "ad" 開始的,而不是 "rd"。如果要看到所有可以使用的常數,請查看 ADODB 型別程式庫。
注意 不需要指定提示行為,因為 ADO 的default設置為"無提示"。不過,如果您選擇對之進行更改,則可以使用 ADO Properties 集合來處理希望的提示行為。在 RDO 中,您可以用 OpenConnection 參數來設置行為。在 ADO 中,您必須設置 Properties ("Prompt") 屬性。
同時,如果您不想使用游標驅動程式,則不必對其進行指定(象在 RDO 中的CursorDriver = rdUseNone),因為 ADO 的default規定是無游標驅動程式。
Private Sub Form_Load()
With cn
' 建立非 DSN 連接
.ConnectionString = ConnectString
.ConnectionTimeout = 10
'.Properties("Prompt") = adPromptNever
' This is the default prompting mode in ADO.
.Open
End With
With cnB
.ConnectionString = ConnectString
.CursorLocation = adUseClient
.Open
End With
End Sub
2。運行一個基本查詢
1.>RDO
該事件程序返回一個基於 SQL 語句的結果集。它執行一個受限查詢,並將結果集傳遞到一個控制項,該控制項將結果資料插入到某個 MSHFlexGrid 控制項中。注意,建立結果集需要一個打開的連接。
Private Sub RunButton_Click()
Dim rs As rdoResultset
Set rs = cn.OpenResultset("select * from titles where title _
like '%h'")
rdoGrid1.ShowData rs
rs.Close
End Sub
2.>ADO
一旦打開了資料庫連接,您就可以對其運行一個查詢。下面的事件程序和先前的 RDO 代碼是非常相似的。不過,在這種情況下,您用進行 SQL 查詢的新 ADO Open 方法和 ADO Connection 物件作為參數,而不是使用 rdoConnection 物件的 OpenResultset 方法。您也可以選擇使用 ADO Connection 物件的 Execute 方法,就象您可以在 RDO 中所做的那樣(只要它不返回一個行集合)。
ADO2 和 RDO2 相比,一個主要的不同之處在于 ADO2 允許您創建一個記錄集,並在打開該記錄集之前對其屬性進行設置。
        Private Sub RunButton_Click()
            Dim rs As New ADODB.Recordset
            rs.Open "select * from titles where title like '%h'", cn
                ADOGrid1.ShowData rs
            rs.Close
        End Sub

您可以運行該查詢,並在 ADO 中非同步地處理其結果集。也就是說,you specify the adFetchAsynch option on rs.Open,ADO 導致游標驅動程式自動充填背景中的結果集。

沒有留言:

張貼留言