一. ADO
ADO (ActiveX Data Objects) 是一個用於存取數據源的COM組件。它提供了程式語言和統一數據訪問方式OLE DB的一個中間層。允許開發人員編寫訪問數據的代碼而不用關心資料庫是如何實現的,而只用關心到資料庫的連接。訪問資料庫的時候,關於SQL的知識不是必要的,但是特定資料庫支持的SQL命令仍可以通過ADO中的命令對象來執行。
架構
ADO被設計來繼承微軟早期的數據訪問對象層,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被發布。
ADO包含一些頂層的對象:
- 連接(Connection),代表到資料庫的連接
- 記錄集(Recordset),代表資料庫記錄的一個集合
- 命令(Command),代表一個SQL命令
- 記錄(Record),代表數據的一個集合
- 流(Stream),代表數據的順序集合
- 錯誤(Error),代表資料庫訪問中產生的意外
- 欄位(Field),代表一個資料庫欄位
- 參數(Parameter),代表一個SQL參數
- 屬性(Property),保存對象的信息
ADO組件的使用需要利用支持COM的高級語言,例如ASP中的VBScript或者Visual Basic.
基本功能
使用 ADO 存取資料的一些基本步驟:
- 生成一個連結物件去連結資料庫(Create a connection object to connect to the database.)
- 生成一個recordset物件來取得資料(Create a recordset object in order to receive data in.)
- 開啟一個連結(Open the connection)
- 在recordset中完成SQL語法的描述(Populate the recordset by opening it and passing the desired table name or SQL statement as a parameter to open function.)
- Do all the desired searching/processing on the fetched data.
- 確定改變資料(Commit the changes you made to the data (if any) by using Update or UpdateBatch methods.)
- 關閉recordset(Close the recordset)
- 關閉連結(Close the connection)
範例
Private Function exist(pTile As String) As Boolean
Dim strsql As String
strsql = "select 1 from G_SRP_INFO where tile='" & pTile & "'"
Dim intRSOpenType As Integer
If madoCN Is Nothing Then
Exit Function
End If
Dim adoRS As ADODB.Recordset
Set adoRS = New ADODB.Recordset
intRSOpenType = adOpenStatic
adoRS.CursorLocation = adUseClient
adoRS.Open strsql, madoCN, intRSOpenType, adLockOptimistic
If CStr(adoRS(0)) = "1" Then
exist = True
Else
exist = False
End If
End Function
二. ADO.NET
ADO.NET是微軟在.NET Framework中負責資料存取的類別庫集,它是使用在COM時代奠基的OLE DB技術以及.NET Framework的類別庫和程式語言來發展的,它可以讓.NET上的任何程式語言能夠連接並存取關聯式資料庫與非資料庫型資料來源(例如XML,Excel或是文字檔資料),或是獨立出來作為處理應用程式資料的類別物件,其在.NET Framework中的地位是舉足輕重,許多人將ADO.NET視為ADO的下一個版本,但其實它是一個全新的架構、產品與概念。
架構
ADO.NET對象模型(object model)有五個主要的對象,分別是Connection對象,Command對象,DataAdpter對象,Dataset對象以及DataReader對象.這些對象中負責建立連線和數據操作的部分我們稱為‘數據操作對象’(Managed Provider),分別由Connection對象,Command對象,DataAdpter對象以及DataReader對象所組成。數據操作對象最主要是當作Dataset對象以及數據源之間的橋梁,負責將數據源中的數據取出後存入Dataset對象中管理,以及將數據存回數據源的工作。
- Connection對象 : 可以開啟程式和數據源之間的連接。沒有利用connection對象將數據源打開,則無法從數據源中取得數據。
- Command對象: 用來對數據源發出指令,如對數據源下達查詢,新增,修改,刪除數據等指令.
- DataAdpter對象: 主要是在數據源以及Dataset之間執行資料傳輸的工作,它可以透過command下達命令后,將取得的資料存入dataset中管理。
- Dataset對象: 可以視作一個緩沖區(cache),可以把從數據源中所查詢得到的資料保留起來,甚至可以將整個數據源內的資料顯示出來。它不但可以儲存多個table,還可以透過DataAdpter對象取得一些如主鍵等的數據表結構,并可以記錄表間的關聯。
- DataReader對象: 若只需要循序讀取數據源中的資料而不需要其他操作,可以使用DataReader對象。DataReader對象讀取是一次一筆,向下循序讀取數據源中的資料,而且被DataReader對象所趨會的數據是唯讀的(read only),并不允許作其他操作。
各部件之间的关系如图下图所示:
ADO.NET和ADO的差異
對於 ADO 的開發人員來說,最明顯的變化在於以往 ADO 中的 Recordset 消失了,並且明確的分開為連線型的 DataReader 以及離線型的 DataSet 與 DataTable,並且發展支援離線型資料來源的瀏覽工具 DataView, 這樣的改變,讓習慣使用 ADO 的 VB/ASP 開發人員會有某種程度的不習慣,同時讓 ADO.NET 的學習會較 ADO 有較些許的複雜性,因此有部分新入門或是VB 6.0/ASP開發人員會在學習.NET Framework或是使用VB.NET開發應用程式時,在 .NET Framework 中使用 ADO 來連接資料來源。但在 .NET Framework 應用程式使用 ADO 的話,.NET Framework會因為要多一層COM和.NET資料之間的轉換,會讓應用程式效能有少部分的損耗。
三. OLD-DB
是微软的战略性的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。
作为微软的组件对象模型(COM)的一种设计,OLE DB是一组读写数据的方法(在过去可能被称为渠道)。OLD DB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。使用OLE DB的应用程序会用到如下的请求序列: 初始化OLE 连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE
Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为部件对象模型。
OLE DB 将传统的数据库系统划分为多个逻辑组件,这些组件之间相对独立又相互通信。这种组件模型中的各个部分被冠以不同的名称:
- 数据提供者(Data Provider): 提供数据存储的软件组件,小到普通的文本文件、大到主机上的复杂数据库,或者电子邮件存储,都是数据提供者的例子。有的文档把这些软件组件的开发商也称为数据提供者。
- 数据服务提供者(Data Service Provider):位于数据提供者之上、从过去的数据库管理系统中分离出来、独立运行的功能组件,例如查询处理器和游标引擎(Cursor Engine),这些组件使得数据提供者提供的数据以表状数据(Tabular Data)的形式向外表示(不管真实的物理数据是如何组织和存储的),并实现数据的查询和修改功能。SQL Server 7.0 的查询处理程序就是这种组件的典型例子。
- 业务组件(Business Component): 利用数据服务提供者、专门完成某种特定业务信息处理、可以重用的功能组件。分布式数据库应用系统中的中间层(Middle-Tier)就是这种组件的典型例子。
- 数据消费者(Data Consumer): 任何需要访问数据的系统程序或应用程序,除了典型的数据库应用程序之外,还包括需要访问各种数据源的开发工具或语言。
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 驱动程序之间的桥梁,理论上不会增加任何开销。
四、 ODBC
ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。微软公司在1993年以DLL集的方式发布了世界上第一个ODBC产品,现在成为了微软开放服务结构(WOSA,Windows Open Services Architecture)中,有关数据库的一个组成部分。微软的ODBC产品其实就是一个ODBC的驱动管理器,提供一个ODBC应用程序到某种ODBC驱动的接口。在UNIX系统上,有两个开源的ODBC驱动管理器,unixODBC和iODBC。
ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用 SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就 是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
一个完整的ODBC由下列几个部件组成:
- 应用程序(Application)。
- ODBC管理器(Administrator): 该程序位于Windows 95控制面板(Control Panel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。
- 驱动程序管理器(Driver Manager): 驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。
- ODBC API。
- ODBC 驱动程序: 是一些DLL,提供了ODBC和数据库之间的接口。
- 数据源:数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
在访问ODBC数据源时需要ODBC驱动程序的支持。用Visual C++ 5.0安装程序可以安装SQL Server、 Access、 Paradox、 dBase、 FoxPro、 Excel、 Oracle 和Microsoft Text等驱动程序.在缺省情况下,VC5.0只会安装SQL Server、 Access、 FoxPro和dBase的驱动程序.如果用户需要安装别的驱动程序,则需要重新运行VC 5.0的安装程序并选择所需的驱动程序。
五,各部件之间的关系如图下图所示:
vate Function exist(pTile As String) As Boolean
Dim strsql As String
strsql = "select 1 from G_SRP_INFO where tile='" & pTile & "'"
Dim intRSOpenType As Integer
If madoCN Is Nothing Then
Exit Function
End If
Dim adoRS As ADODB.Recordset
Set adoRS = New ADODB.Recordset
intRSOpenType = adOpenStatic
adoRS.CursorLocation = adUseClient
adoRS.Open strsql, madoCN, intRSOpenType, adLockOptimistic
If CStr(adoRS(0)) = "1" Then
exist = True
Else
exist = False
End If
End Function