也許你們中的許多人以前沒有聽說過. 要回答這個問題,我們先得回顧一下數據庫連接的歷史. 是英文(object linking and embedding database)的縮寫;
早期的數據庫連接是非常困難的. 每個數據庫的格式都不一樣,開發者得對他們所開發的每種數據庫的底層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; Data
Source=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