ADO数据访问模型初学者入门
ADO(ActiveXDataObjects)是Microsoft提供和建议使用的新型的数据访问接口,具体实现为Automation。这样,程序员可以在各种支持Automation的开发环境下方便地访问ADO对象,如VisualBasic、VisualC++、VisualJ++及Delphi等。ADO被实现为OLEDB之上的一个薄层,这使得ADO可以有更快的访问速度,更易使用,同时更节省资源。值得注意的是,对于VisualStudio6.0的用户而言,现在提供的ADO2.0要比VisualStudio5.0时代的ADO1.5更加完整。这意味着程序员可以更为广泛地使用ADO接口,甚至在所有的基于Windows平台的数据访问中使用它。比如对RDS(前身是ADC)的支持,可以方便的构建高效的Web应用。
一、对ADO对象的主要操作
对ADO对象的主要操作,同DAO、RDO库的实现基本相同。主要包括6个方面:
1.连接到数据源。这是可选的、通常涉及ADO的Connection对象。
2.向数据源提交命令。通常涉及ADO的Command对象。在查询中可以与参数对象(Parameter)协同使用。
3.执行命令,比如一个SELECT脚本。
4.如果提交的命令有结果返回,可以通过ADO的Recordset对象对结果进行操作,数据存储在缓存中。
5.如果合适,可将缓存中被修改的数据更新到物理的存储上。
6.提供错误检测。通常涉及ADO的Error对象。
以程序员的视角来看,ADO、DAO和RDO三者的对象名称不很相同。但使用ADO对象要比DAO和RDO简单得多。最主要的一点在于,程序员不用像在使用DAO和RDO那样要从对象模型的顶层开始一步步的创建子对象。因此,ADO提供了一种更灵活的编程方式。
二、ADO中主要对象的功能
Connection对象,表示了一个到数据源的会话。使用Connection对象的成员,可以使用相应的属性打开到数据源的连接,设置游标的位置,设置默认的当前数据库,设置将使用的OLEDBProvider,直接提交SQL脚本等。值得注意的是,在提交SQL脚本的任务时,不用创建一个Command对象,就可完成查询。另外,对Connection对象的创建是同其他对象无关的。Command对象,可被用于查询数据库并返回结果在Recordset对象中。也可以进行批操作和操纵数据库的结构,当然,这需要使用的OLEDBProvider提供相应的支持。此外,可以将一个激活的Connection对象绑定到Command对象的ActiveConnection属性,这使得多个Command对象实例可以共用一个Connection对象。
Recordset对象,用来封装查询的结果,可称为结果集。
Field对象,用来表达一行结果中各子段的类型和值。
Error对象,用来检测和判断在数据库操作中出现的错误,比如连接失败。 在ADO中,许多对象名后多了一个"s",比如Error->Errors,Field->Fields等等。添加"s"意味着是相应对象的Collection(集合)对象,比如Errors是Error对象的Collection对象。Collection有点像数组(Array),但不同的是,Collection可以以不同类型的数据或对象作为自己的元素,而数组中的各元素通常都是相同类型的。所以,在看到一个对象名最后是"s",通常表明这是一个Collection对象,比如Errors中的各元素是由Error对象的实例组成的。
三、简单的例子
现在,我们在经过了前面的铺垫后,终于可以进入写代码的过程了。下面是一系列在VisualBasic中编写的代码片段,其中对ADO的操纵完全用代码来实现。在开始前,请不熟悉ActiveXAutomation的读者牢记,我们正在使用的,是被实现为ActiveXAutomation的ADO组件。1.打开Connect.ion对象
打开一个到数据源的连接,即Connection对象的VB代码如下:
Dim cn As ADODB.Connection ’声明ADODB.Connection对象变量 Dim strCN As String ’声明存放连接串的字符串变量 Set cn= New Connection ’实例化Connection对象 ’生成连接串(ConnectionString) strCN="Provider=Microsoft.Jet.Oledb.3.51; UserID=Admin;"&_ "DataSource=D:\MicrosoftVisual Studio\VB98\Nwind.mdb;" cn.Open strCN ’调用Connection对象的方法Open连接数据源
以上代码在访问ADO对象时,使用了前绑定(Early-bind),实现前绑定需要从VisualBasic的Project菜单下选择Reference菜单项,并选择MicrosoftActiveXDataObjects2.0Library。在程序中声明的strCN变量中,连接串属性Provider标识了OLEDBProvider为OLEDBProviderforMicrosoftJet,因为我们访问的是MicrosoftAccess数据文件,使用MicrosoftJetEngine可以获得比ODBC更好的性能。在试验以上代码时有两个地方要注意。首先,要根据系统安装的OLEDBProviderforMicrosoftJet服务选择相应版本,可能是3.51,也可能是4.0。在本例中使用的是3.51版本。如果使用4.0版本,首先需要将Provider属性改为"Microsoft.Jet.Oledb.4.0";其次,DataSource属性标识了所要访问的数据文件的路径,要根据自己的安装情况作出适当的调整。文件Nwind.mdb通常被VisualStudio默认安装,一般放在Visual Basic的工作目录下。
除了OLEDB Provider for MicrosoftJet以外,Visual Studio6.0还提供了以下的OLEDBProvider,如下所示。
OLEDB Provider类型 数据源类型 Microsoft OLEDB Provider for ODBC databases Microsoft OLEDB Provider for Microsoft Index Server Microsoft(r) Index Server Microsoft OLEDB Provider for Microsoft Active Directory Service Microsoft(r) Active Directory Service Microsoft OLEDB Provider for SQLServer Microsoft(r) SQLServer Microsoft OLEDB Provider for Oracle Oracle databases
这意味着使用ADO接口可以方便地访问以上的各种数据源,要做的就是选择适当的OLEDB Provider。除了使用Connection对象的Open方法以外,还可通过Recordset对象的Open方法快捷地创建到数据源的连接。这充分体现了ADO的灵活性。
2.创建Command对象
Dim cmd As ADODB.Command
Set cmd=New Command’实例化Command对象
3.执行查询
以Command对象为例。
Dim rs As New ADODB.Recordset
Set cmd.ActiveConnection=cn’绑定激活的Connection对象实例
cmd.CommandText="SELECT*from Customers"’生成SQL脚本
Set rs=cmd.Execute’执行查询
上述的代码仅仅是一种查询途径,此外,ADO的Connection对象的Execute方法和Recordset对象的Open方法也提供了查询能力。返回的结果可以被保存在一个Recordset对象实例中以便后续的数据处理和操纵。例如:
Dim rs As NewADODB.Recordset
rs.Open cmd,cn,adOpenDymanic,adLockBatchOptimistic
另外在SQL脚本的生成方式上,通常可以借助Parameters/Parameter对象来完成。
4.显示和操纵数据
查询结果由Recordset对象封装。对数据的操纵可以通过Recordset对象提供的成员(属性和方法)来完成。
rs.MoveFirst
Do While Not rs.EOF’判断EOF标记属性(Endoffile)
Debug.Print rs!CustomerID & vbTab & rs!CompanyName & _
vbTab & rs!ContactName & vbTab & rs!ContactTitle
rs.MoveNext’将游标指针移到下一条记录
Loop
上述代码将Recordset中的各行记录打印在Visual Basic的Immediate Window中。为了看到打印的结果,可以在上述代码之后,增加一条Stop语句,以便进入Debug状态。
5.更新记录
使用Recordset对象来完成Update操作。
rs.Close’关闭之前建立的结果集
’打开新的结果集,具有写操作权限
rs.Open"Customers",cn,adOpenDynamic,adLockOptimistic,adCmdTable
rs.MoveFirst’虽无必要,但可能是一个良好的习惯
rs!CompanyName="Microsoft"’对相应字段赋予新值
rs.Update’在物理存储上生效
除了Update以外,写操作还包括AddNew(添加一条新记录)和Delete(删除一条新记录)。另外,Recordset支持批处理,但这些特征需要由低层的OLEDBProvider支持。当写操作出现错误时,可根据错误描述(访问ADO的Error或VisualBasic的Err对象)来判断原因。另一个需要注意的是,当使用Recordset对象完成写操作时,需要预先指定Recordset对象实例非只读。
6.收尾工作
在这个阶段应该显式的释放相应的资源,如果不做的话,通常VisualBasic会自动释放和回收资源。但对于一个有良好编程习惯的程序员来说,应该主动地做收尾工作,就像下面的代码一样。
rs.Close
Set rs=Nothing
Set cmd=Nothing
cn.Close
Set cn=Nothing
|