OLE DB
OLE DB
OLE DB(OLEDB)是微軟的戰略性的通向不同的數據源的低級應用程序介面。OLE DB不僅包括微軟資助的標準數據介面開放資料庫連通性(ODBC)的結構化查詢語言(SQL)能力,還具有面向其他非SQL數據類型的通路。
OLE全稱Object Link and embed,即對象連接與嵌入。
作為微軟的組件對象模型(COM)的一種設計,OLE DB是一組讀寫數據的方法(在過去可能被稱為渠道)。OLE DB中的對象主要包括數據源對象、階段對象、命令對象和行組對象。使用OLE DB的應用程序會用到如下的請求序列:初始化OLE 連接到數據源、發出命令、處理結果、釋放數據源對象並停止初始化OLE Object Linking and Embedding,對象連接與嵌入,簡稱OLE技術。OLE不僅是桌面應用程序集成,而且還定義和實現了一種允許應用程序作為軟體“對象”(數據集合和操作數據的函數)彼此進行“連接”的機制,這種連接機制和協議稱為部件對象模型。
OLE是一種面向對象的技術,利用這種技術可開發可重複使用的軟體組件(COM)。
DB(英文全稱data base,資料庫)是依照某種數據模型組織起來並存放二級存儲器中的數據集合。
OLE DB最主要是由三個部分組合而成:
Data Providers數據提供者
Data Consumers數據使用者
凡是使用OLE DB提供數據的程序或組件,都是OLE DB 的數據使用者。換句話說,凡是使用ADO 的應用程序或網頁都是OLE DB的數據使用者。
Service Components服務組件
數據服務組件可以執行數據提供者以及數據使用者之間數據傳遞的工作,數據使用者要向數據提供者要求數據時,是透過OLE DB服務組件的查詢處理器執行查詢的工作,而查詢到的結果則由指針引擎來管理。
OLE DB將傳統的資料庫系統劃分為多個邏輯組件,這些組件之間相對獨立又相互通信。這種組件模型中的各個部分被冠以不同的名稱:
數據提供者
(Data Provider)。提供數據存儲的軟體組件,小到普通的文本文件、大到主機上的複雜資料庫,或者電子郵件存儲,都是數據提供者的例子。有的文檔把這些軟體組件的開發商也稱為數據提供者。
數據服務提供者
(Data Service Provider)。位於數據提供者之上、從過去的資料庫管理系統中分離出來、獨立運行的功能組件,例如查詢處理器和游標引擎(Cursor Engine),這些組件使得數據提供者提供的數據以表狀數據(Tabular Data)的形式向外表示(不管真實的物理數據是如何組織和存儲的),並實現數據的查詢和修改功能。SQL Server 7.0 的查詢處理程序就是這種組件的典型例子。
業務組件(Business Component)。利用數據服務提供者、專門完成某種特定業務信息處理、可以重用的功能組件。分散式資料庫應用系統中的中間層(Middle-Tier)就是這種組件的典型例子。
數據消費者(Data Consumer)。任何需要訪問數據的系統程序或應用程序,除了典型的資料庫應用程序之外,還包括需要訪問各種數據源的開發工具或語言。
開始編寫OLE DB應用程序之前應考慮以下問題:
使用何種編程實現來編寫OLE DB應用程序?
Microsoft提供多種庫來解決該問題:OLE DB模板庫、OLE DB屬性以及OLE DB SDK中的原始OLE DB介面。另外,Microsoft還提供幫助您編寫程序的嚮導。有關這些實現的更詳細的信息,請參見OLE DB模板、屬性和其他實現。
是否需要編寫自己的提供程序?
大多數開發人員無需這樣。Microsoft提供多種提供程序。無論用戶何時創建一個數據連接,例如,當使用ATL OLE DB使用者嚮導向項目中添加使用者時,“數據鏈接屬性”對話框都將列出系統中所有被註冊的可用提供程序。如果其中一個提供程序適合於用戶自己的數據存儲和數據訪問應用程序,最簡單的辦法就是使用該提供程序。但是,如果用戶的數據存儲不適合所提供的類別,則必須創建自己的提供程序。有關創建提供程序的信息,請參見OLE DB提供程序模板及其子主題。
需要為自己的使用者提供何種級別的支持?
一些使用者可能非常簡單,另一些可能非常複雜。OLE DB對象的功能由屬性指定。使用ATL OLE DB使用者嚮導創建使用者或者使用資料庫提供程序嚮導創建提供程序時,嚮導將為用戶設置合適的對象屬性來提供一組標準功能。但是,如果嚮導生成的使用者類或提供程序類並不具有您需要的所有支持功能,那麼您需要查閱這些類在OLE DB模板庫中的介面。這些介麵包裝原始OLE DB介面,提供附加實現以使其使用起來更加簡單。
例如,如果您希望更新行集合中的數據,但在使用嚮導創建使用者時卻忘記指定該功能,則可以在創建使用者之後通過對命令對象設置DBPROP_IRowsetChange和DBPROP_UPDATABILITY屬性來指定該功能。這樣,當行集合創建之後,它將具有IRowsetChange介面。
您是否有使用其他數據訪問技術(ADO、ODBC或DAO)的舊版代碼?
由於可能有各樣各樣的技術組合(例如ADO組件和OLE DB組件一起使用、將ODBC代碼遷移至OLE DB等等),所以Visual C++文檔不能涵蓋所有的情形。
OLE DB與ODBC的關係
由於OLE DB和ODBC標準都是為了提供統一的訪問數據介面,所以曾經有人疑惑:OLE DB是不是替代ODBC的新標準?答案是否定的。實際上,ODBC標準的對象是基於SQL的數據源(SQL-Based Data Source),而OLE DB的對象則是範圍更為廣泛的任何數據存儲。從這個意義上說,符合ODBC標準的數據源是符合OLE DB標準的數據存儲的子集。符合ODBC標準的數據源要符合OLE DB標準,還必須提供相應的OLE DB服務程序(Service Provider),就像SQL Server要符合ODBC標準,必須提供SQL Server ODBC驅動程序一樣。現在,微軟自己已經為所有的ODBC數據源提供了一個統一的OLE DB服務程序,叫做ODBC OLE DB Provider。
ODBC OLE DB Provider發布之後,有人又擔心:ODBC Provider是不是在ODBC之上的新的層次(Layer)?如果是,那麼使用OLE DB訪問ODBC數據源是否將影響性能?答案也是否定的。實際上,ODBC Provider的作用,是替換ODBC Driver Manager,作為應用程序與ODBC驅動程序之間的橋樑,理論上不會增加任何開銷。