[返回]
微电脑世界1999年第1 3期
潘爱民
五、使用ADO 访问数据
前面我们已经介绍了ADO
的结构和特性,也简单介绍了在不同语言中调用ADO
对象的方法,现在我们从开发应用的角度来进一步讲述如何利用ADO
进行数据访问。
(1) 如何建立数据源连接
建立连接的核心是使用连接串。连接串包含所有用来建立数据源连接的信息,它使用一系列格式为“参数=
值”的语句,并用“;”连接起来。ADO
根据连接串建立连接,首先它找到“Provider"参数信息,以便调用适当的OLE
DB 提供者。ADO 可以理解以下4 个参数信息:
Provider =
File Name =
Remote Provider=
Remote Server=
ADO
把其他的参数信息传给提供者,由提供者根据这些参数信息建立数据源连接。
Connection 对象既可以使用ConnectionString 属性建立连接,也可以在Open
方法的参数中指定连接串,甚至可以把二者结合起来,如果在Open
的参数和ConnectionString 属性中同时出现同一个参数信息,则以Open
参数信息为准。我们还可以通过Connection 对象的Provider 属性指定OLE DB
提供者,下面是目前可以使用的一些“Provider"信息:
MSDASQL --针对ODBC 的OLE DB 提供者;
SQLOLEDB --针对SQL Server 的OLE DB 提供者;
ADsDSOObject --针对Active Directory Service 的OLE DB 提供者;
MSIDXS --针对Microsoft Index Server 的OLE DB 提供者;
Microsoft.Jet.OLEDB.3.51 --针对Microsoft Jet 的OLE DB 提供者;
MSDAORA --针对Qracle 的OLE DB 提供者。
如果在Open 方法参数、Connection-String 或Provider 属性中都没有指定OLE
DB 提供者,则ADO 使用缺省的针对ODBC 的OLE DB 提供者即“MSDASQL"。下面给出3
个典型的连接串例子:
方法1:
Dim Cn As New ADODB.Connection
Cn.Open "Provider=SQLOLEDB;User
ID=sa;Password=;"& "Initial Catalog=MyDataBase;
Data Source=MyServer"
方法2:
Dim Cn As New ADODB.Connection
Cn.ConnectionString = "Provider=SQLOLEDB;User
ID=sa;Password=;"&"Initial Catalog=
MyDataBase;Data Source=MyServer"
Cn.Open
方法3:
Dim Cn As New ADODB.Connection
Cn.Provider = "SQLOLEDB"
Cn.Properties("User ID").Value = "sa"
Cn.Properties("Initial Catalog").Value ="MyDataBase"
Cn.Properties("Data Source").Value ="MyServer"
Cn.Open
(2) 如何处理事件
前面曾经说过,使用ADO 2.0,我们可以在程序中处理Connection
对象或者Recordset 对象的事件,那么如何在程序中实现呢?利用Visual
Basic 语言提供的WithEvents
关键字可以很方便地建立事件源对象和事件控制函数的连接关系。下面对此作一简单说明。
首先,为了处理事件源所引发的事件,用WithEvents
关键字声明对象类变量,例如:
Option Explicit
Dim WithEvents Cn As Connection
然后给出事件控制函数,按照Visual Basic
语言约定,事件控制函数的函数名为“事件源名_
事件名”,例如,我们要响应Connection 对象Cn 的ConnectComplete
事件,则事件控制函数名为Cn_ConnectComplete,代码可以这样来写:
Private Sub Cn_ConnectComplete(ByVal
pError As ADODB.Error,adStatus As
ADODB.EventStatusEnum, ByVal pConnection
As ADODB.Connection)
......
End Sub
以后当建立连接Cn 完成后,ADO 激发ConnectionComplete
事件,它自动调用Cn_ConnectComplete 函数。
(3) 执行查询的方法
利用ADO 执行查询的方法很多,最基本的方法是使用Command
对象,也可以直接调用Connection 对象的Execute 方法。下面介绍使用Command
对象执行查询的方法。
首先建立数据源连接Connection 对象,然后创建Command 对象:
Dim cmd as New ADODB.Command
cmd.CommandText ="Select * from AuthorTable"
cmd.Name = "MyCommand"
cmd.ActiveConnection = Cn
然后调用Command 对象的Execute 方法:
set rs = cmd.Execute
或者通过Connection 对象的方法:
set rs = cn.MyCommand
我们也可以不用Command 对象,而是直接使用Recordset
对象,举例如下:
Dim rs as New ADODB.Recordset
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Open "AuthorTable", cn, , ,
adCmdTableset
甚至连Connection 对象都可以不使用,直接由Recordset
使用内部连接,只需在Open 语句中给出必要的连接信息即可。
(4) 对记录集数据进行操作
对记录集数据进行各种移动或修改操作是应用程序访问数据最重要的任务,与其他一些数据访问接口一样,这些操作集中在记录集对象和域对象的属性和方法调用上,在ADO
对象模型中,主要是Recordset 和Field 对象的一些方法的用法。
增加记录操作:AddNew 方法,再调用Update 方法,如:
rs.AddNew
rs!Author_id = strID
rs!AuthorName = strName
rs!Title = strTitle
rs.Update
删除记录操作:调用Delete
方法可以删除当前记录或者满足条件的一组记录。在立即修改模式下,删除马上生效;在批修改模式下,Delete
操作只在当前缓冲区中的记录上作了标记,只有当调用了UpdateBatch
之后,记录才真正被删除。一个简单的例子如下:
rs.Filter = "Title ='Engineer'"
rs.Delete adAffectGroup 'Delete the record.
rs.UpdateBatch
修改记录操作:对当前记录的各个域信息进行重新赋值后,调用Update
方法,如果要取消修改,则调用CancelUpdate 方法。举例如下:
rs!Author_id = strID
rs!AuthorName = strName
rs!Title = strTitle
rs.Update
移动和遍历操作:Recordset
提供了各种方向的移动操作,利用这些操作可以对记录集进行遍历处理。各种移动操作如右表所示。
利用这些属性和方法,可以很灵活地访问记录集,下面举例说明:
rs.MoveFirst
Do While True
strMessage = "Author:"& rs!AuthorName & vbCr &
"(record"& rs.AbsolutePosition & "of"&
rs.RecordCount &")"& vbCr & vbCr &
"Please enter command:"& vbCr &
"[1 - next / 2 - previous /"& vbCr &"3
- set bookmark / 4 - go to bookmark]"
intCommand = Val(InputBox(strMessage))
Select Case intCommand
'Move forward or backward, trapping
for BOF or EOF.
Case 1
rs.MoveNext
If rs.EOF Then
MsgBox ......
rs.MoveLast
End If
Case 2
rs.MovePrevious
If rs.BOF Then
MsgBox ......
rstPublishers.MoveFirst
End If
'Store the bookmark of the current record.
Case 3
varBookmark = rs.Bookmark
'Go to the record indicated by the stored bookmark.
Case 4
If IsEmpty(varBookmark) Then
MsgBox "No Bookmark set!"
Else
rs.Bookmark = varBookmark
End If
Case Else
Exit Do
End Select
Loop
| 操 作 | 类型 | 说明 |
| MoveFirst | 方法 | 移动到记录集首 |
| MoveLast | 方法 | 移动到记录集尾 |
| MoveNext | 方法 | 移动到下一条记录 |
| MovePrevious | 方法 | 移动到上一条记录 |
| Move | 方法 | 往前或往后移动数条记录 |
| Bookmark | 属性 | 返回标识当前记录的书签或设置到指定的书签位置 |
| BOF | 属性 | 若当前位置在首条记录之前,则返回True否则为False |
| EOF | 属性 | 若当前位置在最后记录之后,则返回True否则为False |
-