ActiveX Data Objects

微软公司的ADO(ActiveX Data Objects)是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
历史
ADO被设计来继承微软早期的数据访问对象层,包括RDO(Remote Data Objects)和DAO(Data Access Objects)。ADO在1996年冬被发布。
Microsoft Office 2000中发布了ActiveX Data Objects 2.1 Library(MSADO21.TLB)。Microsoft Office 2002中发布了ActiveX Data Objects 2.5 Library(MSADO25.TLB)。Microsoft ADO Extensions 2.5 for DDL and Security Library(MSADOX.DLL)包含了下述object与collection:Catalog、Column、Group、Index、Key、Procedure、Property、Table、User object and Users collection、View。Microsoft Jet and Replication Objects 2.5 Library(MSJRO.DLL)包括了Filter object与collection,JetEngine object,Replica object。[1]
在新的编程框架.NET Framework中,微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。其对象模型和传统ADO差别很大。
架構
ADO包含12个对象:
- 连接(Connection),代表到数据库的连接
- 记录集(Recordset),代表数据库记录的一个集合
- 命令(Command),代表一个SQL命令
- 记录(Record),代表数据库的一条记录
- 流(Stream),代表数据的顺序集合。主要用于RecordSet对象,用于读写字节流。常用于把recordset保存为XML格式,向OLE DB provider发送命令文本(替代CommandText对象),包含二进制或文本内容。
- 错误(Error),代表数据库访问中OLE DB提供的错误
- 字段(Field),代表一个数据库字段
- 参数(Parameter),代表一个参数,用于SQL或存储过程。
- 属性(Property),保存对象的信息
- ImmediateThe recordset is locked using the adLockOptimistic or adLockPessimistic lock.
- Batch:recordset使用adLockBatchOptimistic上锁。每次Update操作在一个临时buffer中修改数据。当UpdateBatch调用时数据才真正修改回数据库。调用UpdateCancel放弃临时buffer中数据。
- Transaction:如果OLE DB允许事务操作,则BeginTrans、CommitTrans、RollbackTrans可调用
ADO包含4个collection:
- Fields
- Properties
- Parameters
- Errors
使用
ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者Visual Basic,甚至微软的竞争对手Borland的产品Delphi,,现在也支持使用ADO来访问数据库。
使用ADO存取資料的一些基本步驟:
- 创建連接物件去連結資料庫(Create a connection object to connect to the database.)
- 创建记录集物件來取得資料(Create a recordset object in order to receive data in.)
- 打开連接(Open the connection)
- 在记录集中完成SQL語法的描述(Populate the recordset by opening it and passing the desired table name or SQL statement as a parameter to open function.)
- 对获取的数据进行搜索/处理操作。
- 確定改變資料(Commit the changes you made to the data (if any) by using Update or UpdateBatch methods.)
- 關閉记录集(Close the recordset)
- 關閉連接(Close the connection)
ASP範例
下列的ASP範例使用ADO於"Phonebook"表中選取"Name"欄位,其中"PhoneNumber"等於"555-5555"。
dim myconnection, myrecordset, name
set myconnection = server.createobject("ADODB.Connection")
set myrecordset = server.createobject("ADODB.Recordset")
myconnection.open mydatasource
myrecordset.open "Phonebook", myconnection
myrecordset.find "PhoneNumber = '555-5555'"
name = myrecordset.fields.item("Name")
myrecordset.close
set myrecordset = nothing
set myconnection = nothing
這相當於下列的ASP code,以plain SQL取代Recordset object:
dim myconnection, myrecordset, name
set myconnection = server.createobject("ADODB.connection")
myconnection.open mydatasource
set myrecordset = myconnection.execute("SELECT Name FROM Phonebook WHERE PhoneNumber = '555-5555'")
name = myrecordset(0)
C语言例子
AfxOleInit();//COM库的初始化
#import "c:\program files\common files\system\ado\msado15.dll " no_namespace rename( "EOF ", "adoEOF ") //系统生成msado15.tlh,ado15.tli两个头文件来定义ADO库
_ConnectionPtr m_pConnection; //指向Connection对象的指针
HRESULT hr;
hr = m_pConnection.CreateInstance( "ADODB.Connection ");///创建Connection对象
if(SUCCEEDED(hr))
{ //连接数据库:
hr = m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb ", " ", " ",adModeUnknown); //未设置第二个参数UserID、第三个参数Password
}
//上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;
/*第四个参数Options可以取值为:
adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象打开连接
adModeShareDenyNone:允许其它程序或对象以任何权限建立连接 */
参考文献
外部链接
參見
ㄍ