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代码如下:
以上代码在访问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,如下所示。
这意味着使用ADO接口可以方便地访问以上的各种数据源,要做的就是选择适当的OLEDB Provider。除了使用Connection对象的Open方法以外,还可通过Recordset对象的Open方法快捷地创建到数据源的连接。这充分体现了ADO的灵活性。
2.创建Command对象
3.执行查询
以Command对象为例。
上述的代码仅仅是一种查询途径,此外,ADO的Connection对象的Execute方法和Recordset对象的Open方法也提供了查询能力。返回的结果可以被保存在一个Recordset对象实例中以便后续的数据处理和操纵。例如:
另外在SQL脚本的生成方式上,通常可以借助Parameters/Parameter对象来完成。
4.显示和操纵数据
查询结果由Recordset对象封装。对数据的操纵可以通过Recordset对象提供的成员(属性和方法)来完成。
上述代码将Recordset中的各行记录打印在Visual Basic的Immediate Window中。为了看到打印的结果,可以在上述代码之后,增加一条Stop语句,以便进入Debug状态。
5.更新记录
使用Recordset对象来完成Update操作。
rs.Close’关闭之前建立的结果集
’打开新的结果集,具有写操作权限
除了Update以外,写操作还包括AddNew(添加一条新记录)和Delete(删除一条新记录)。另外,Recordset支持批处理,但这些特征需要由低层的OLEDBProvider支持。当写操作出现错误时,可根据错误描述(访问ADO的Error或VisualBasic的Err对象)来判断原因。另一个需要注意的是,当使用Recordset对象完成写操作时,需要预先指定Recordset对象实例非只读。
6.收尾工作
在这个阶段应该显式的释放相应的资源,如果不做的话,通常VisualBasic会自动释放和回收资源。但对于一个有良好编程习惯的程序员来说,应该主动地做收尾工作,就像下面的代码一样。
一、对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 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?