2010-06-23 VBA环境下的ADO编程方法全程解析

说明:网上的很多资料很全,但是唯一的缺点就是读起来有点儿费劲。这篇ADO编程详解,是在我的新书(别急,还没出版呢!)中的一小节,大家能读懂不?如此菜鸟的技术,在各位大虾面前献丑了。
 
ActiveX数据对象ADO是一种数据访问接口,可以与符合OLE DB标准的数据源通信,以检索、操作和更新数据。ADO的最大优点是易于使用,速度快,内存占用低,占用磁盘空间少等。一般而言,利用ADO进行数据访问和操作的主要步骤是:
1)连接数据源;
2)设置查询命令;
3)执行查询命令。
在典型情况下,需要在编程过程中按照步骤进行编程。但是,由于 ADO 有很强的灵活性,所以很多情况下只需执行部分模块就能完成需要的功能。
 
ADO对象库中主要有9个对象,即:ConnectionCommandRecordsetRecordFieldErrorPropertyParameterStream。这9个对象中又有三个即ConnectionCommandRecordset是最为常用的,很多情况下只需要这三个对象即可完成数据的读取和操作。
 

12.4.2 Connection对象

ADO Connection 对象代表了打开的、与数据源的连接,好像在应用程序和数据库中建立了一条数据传输连线,该对象代表了与数据源进行的惟一会话。如果是C/S数据库系统,该对象可等价于到服务器的实际网络连接。通过此连接,用户可以对被连接到的数据源进行访问和操作。
如果需要多次访问某个数据库,用户应当使用 Connection 对象来建立一个连接。如下例所示的就是在ASP语言中创建Connection对象并建立连接:
<%
Set Conn=Server.Createobject("ADODB.Connection")
Conn.Provider="Microsoft.Jet.OLEDB.4.0"
Conn.Open "C:/Webdata/Northwind.Mdb"
Response.Write(Conn.Provider)
Conn.Close
%>
在上面的例子中使用了Connection对象的Provider属性和Open方法,关于Connection对象的更多属性和方法,请参阅帮助中心的ADO程序员参考。

 

Connection对象在C/SB/S开发过程中是必备的ADO对象,但是在Access开发中,用户既可以自己定义Connection对象,也可以直接使用VBACurrentProject对象的Connection属性来实现连接,如下例所示:
自行定义Connection对象实现连接:
Dim Cnn as New ADODB.Connection
Dim Rst As New ADODB.Recordset '定义对象变量
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D: \ADO.Mdb"
Set Rst.Activeconnection = Cnn
使用Access VBACurrentProject对象的Connection属性实现连接:
Set rst = New ADODB.Recordset
rst.ActiveConnection = CurrentProject.Connection

12.4.3 Command对象:

ADO Command 对象用于执行面向数据库的一次简单查询。此查询可以是创建、添加、取回、删除或更新记录等动作。
如果该查询命令用于取回数据,则此数据将以Recordset 对象返回。这意味着被取回的数据能够利用Recordset对象的属性、集合、方法或事件进行操作。
Command对象中,可以使用 CommandText 属性定义命令的可执行文本,通过 Parameter 对象和 Parameters 集合定义参数化查询或存储过程参数,可使用 Execute 方法执行命令并在适当的时候返回 Recordset 对象。

 

如果不想使用 Command 对象执行查询,可以将查询字符串传送给Connection 对象的 Execute 方法或 Recordset 对象的 Open 方法。但是,当需要使命令文本具有持久性并重新执行,或使用查询参数时,就使用 Command 对象了。
如下例所示的就是在ASP语言中创建Command对象并建立调用:
<%
Set Conn = Server.Createobject("ADODB.Connection")
Set Cmd = Server.Createobject("ADODB.Command")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("Data.mdb")
cmd.ActiveConnection = Conn
'ActiveConnection属性使打开的连接与 Command 对象关联
cmd.CommandText = "Select * from student"
'CommandText 属性定义命令,可在ACCESS的查询表中建立查询表(表名亦即存储过程名称),或直接书写SQL语句
Set rs = cmd.Execute
'Execute 方法执行命令并在适当的时候返回 Recordset 对象
...'应用rs,可输出记录
%>
在上面的例子中使用了Command对象的ActiveConnection属性和CommandText属性。

 

Access开发中,用户定义使用Command对象,也可以直接使用更简单的Recordset对象的Open方法,来直接打开查询字符串,如下例所示:
Set rs = as New ADODB.Recordset '建立数据库对象
rs.activeconnection = CurrentProject.Connection '建立连接
rs.cursortype = adopendynamic
rs.locktype = adlockoptimistic
rs.Open sql '按照设置的SQL查询方法,打开数据库对象

12.4.4 Recordset对象:

读者可以看到,在前面的两小节举例中,都用到了Recordset对象,那么什么是Recordset对象,为什么每个例子中都需要使用该对象呢?
ADO 中,Recordset对象是最重要且最常用于对数据库的数据进行操作的对象。ADO Recordset对象用于容纳来自数据库表的记录集。任何涉及数据的查询、修改、创建与删除操作,都需要创建该对象,并在该数据集中进行操作。
当用户首次打开一个 Recordset 对象时,当前记录指针将指向第一个记录,同时 BOF EOF 属性为 False。如果没有记录,BOF EOF 属性为 True
Recordset对象是通过指针来对集合中的数据进行操作的,在ADO中定义了 4 中不同的指针类型:
1)动态指针AdOpenDynamic - 允许用户查看其他用户所作的添加、更改和删除
2)键集指针AdOpenKeyset - 类似动态游标,不同的是用户无法查看其他用户所做的添加,并且它会防止您访问其他用户已删除的记录。其他用户所做的数据更改仍然是可见的。
3)静态指针AdOpenStatic - 提供记录集的静态副本,可用来查找数据或生成报告。此外,由其他用户所做的添加、更改和删除将是不可见的。当您打开一个客户端 Recordset 对象时,这是唯一被允许的游标类型。
4)仅向前指针AdOpenForwardOnly - 只允许在 Recordset 中向前滚动。此外,由其他用户所做的添加、更改和删除将是不可见的。
需要注意的是:一旦打开Recordset,你就无法改变CursorType属性。但是,如果你首先关闭Recordset,改变CursorType属性,然后重新打开Recordset,那么你仍可以有效地改变游标的类型!
Recordset对象中,用户需要通过CursorType 属性来设置游标的类型。
Recordset对象中,还有一个重要的属性是LockType。在任何可能被多用户同时修改的数据库中,开发者必须预见到可能发生多个用户同时对同一条记录进行操作时的情况。当这种情况出现时,数据的完整性就不能得到保证。为了处理这种情况,ADO允许用户在对Recordset对象进行更新时决定事件控制的类型,当一个用户编辑时,如何由他对记录进行锁定。这就是由LockType属性所决定的。LockType属性有四个值:
1adLockReadonly:默认值,只读,无法更改数据。这是Recordset的默认值,如果用户把锁定方式设为该值,那么用户将不能更新 Recordset
2adLockPessimistic:保守式记录锁定。提供者执行必要的操作确保成功编辑记录,通常采用编辑时立即锁定数据源的记录的方式。如果设置为此类锁定,记录被锁定,且只有在编辑开始到将记录更新的提交给数据提供者这段时间内进行编辑的用户才可以访问!
3adlockoptimistic:开放式记录锁定(逐条)。提供者使用开放式锁定,只在调用 Update 方法时锁定记录。只有在将数据提交给数据提供者的那一瞬间才把记录锁定。
4adlockBatchOptimistic:开放式批更新。设定为这种类型的锁定制式将被称为批量更新模式的Recordset 可以加快更新Recordset修改数据的速度,但因为同时更新多个记录,它也会恶化与并发访问相关的问题!
在介绍了Recordset对象的几个重要属性后,Access中对Recordset对象的使用举例如下所示。
Dim sql As String
Dim rs As New ADODB.Recordset '定义数据对象
sql = "SELECT * FROM 客户表 'sql字符串赋值
rs.activeconnection = CurrentProject.Connection '建立连接
rs.cursortype = adopendynamic '设置指针类型
rs.locktype = adlockoptimistic '设置锁定方式
rs.Open sql '按照设置的SQL查询方法,打开数据库对象
If rs.EOF Then
DoCmd.Beep
MsgBox ("用户名或密码错误,请重新输入!")
....
 
在运行该过程前,先到VBA编辑器的【引用】对话框中,选择引用“Microsoft ActiveX Data Objects 2.8 Library”对象库,否则会提示“用户定义类型为定义”的错误提示。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章