打开 ADO 连接和 Recordset 对象

本文介绍了如何打开 ADO 连接和 Recordset 对象。

原始产品版本:   SQL Server
原始 KB 编号:   168336

摘要

ActiveX数据对象 (ADO) 提供了多种打开 Connection 和 Recordset 对象的方法。 本文介绍针对每个对象的多种常见技术的示例代码。

更多信息

有几种方法在 ADO 中打开 Connection 对象:

  • 将该属性 ConnectionString 设置为有效的 Connect 字符串,然后调用 Open() 该方法。 此连接字符串依赖于提供程序。
  • 将有效的 Connect 字符串传递给方法的第一个参数 Open()
  • 将有效的 Command 对象传递给 Recordset Open 方法的第一个参数。
  • 通过向 Connection 对象的方法传递 ODBC 数据源名称和用户 ID 和密码(可选 Open() )。

有三种方法在 ADO 中打开 Recordset 对象:

  • 通过从方法中打开 Connection.Execute() Recordset。
  • 通过从方法中打开 Command.Execute() Recordset。
  • 通过打开 Recordset 对象而不打开 Connection 或 Command 对象,将有效的 Connect 字符串传递给方法的第二个参数 Recordset.Open()

此代码假定 Nwind.mdb 与 Visual Basic一起安装,并且位于 C:\Program Files\DevStudio\VB directory

Option Explicit

Private Sub cmdOpen_Click()

    Dim Conn1 As New adodb.Connection
    Dim Cmd1 As New adodb.Command
    Dim Errs1 As Errors
    Dim Rs1 As New adodb.Recordset
    
    Dim i As Integer
    Dim AccessConnect As String
    
    ' Error Handling Variables
    Dim errLoop As Error
    Dim strTmp As String
    
    AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
    "Dbq=nwind.mdb;" & _
    "DefaultDir=C:\program files\devstudio\vb;" & _
    "Uid=Admin;Pwd=;"
    
    '---------------------------
    ' Connection Object Methods
    '---------------------------
    
    On Error GoTo AdoError ' Full Error Handling which traverses
    ' Connection object
    
    ' Connection Open method #1: Open via ConnectionString Property
    Conn1.ConnectionString = AccessConnect
    Conn1.Open
    Conn1.Close
    Conn1.ConnectionString = ""
    
    ' Connection Open method #2: Open("[ODBC Connect String]","","")
    Conn1.Open AccessConnect
    Conn1.Close
    
    ' Connection Open method #3: Open("DSN","Uid","Pwd")
    Conn1.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
    "DBQ=nwind.mdb;" & _
    "DefaultDir=C:\program files\devstudio\vb;" & _
    "Uid=Admin;Pwd=;"
    Conn1.Close
    
    '--------------------------
    ' Recordset Object Methods
    '--------------------------
    
    ' Don't assume that we have a connection object.
    On Error GoTo AdoErrorLite
    
    ' Recordset Open Method #1: Open via Connection.Execute(...)
    Conn1.Open AccessConnect
    Set Rs1 = Conn1.Execute("SELECT * FROM Employees")
    Rs1.Close
    Conn1.Close
    
    ' Recordset Open Method #2: Open via Command.Execute(...)
    Conn1.ConnectionString = AccessConnect
    Conn1.Open
    Cmd1.ActiveConnection = Conn1
    Cmd1.CommandText = "SELECT * FROM Employees"
    Set Rs1 = Cmd1.Execute
    Rs1.Close
    Conn1.Close
    Conn1.ConnectionString = ""
    
    ' Recordset Open Method #3: Open via Command.Execute(...)
    Conn1.ConnectionString = AccessConnect
    Conn1.Open
    Cmd1.ActiveConnection = Conn1
    Cmd1.CommandText = "SELECT * FROM Employees"
    Rs1.Open Cmd1
    Rs1.Close
    Conn1.Close
    Conn1.ConnectionString = ""
    
    ' Recordset Open Method #4: Open w/o Connection & w/Connect String
    Rs1.Open "SELECT * FROM Employees", AccessConnect, adOpenForwardOnly
    Rs1.Close
    
    Done:
    Set Rs1 = Nothing
    
    Set Cmd1 = Nothing
    Set Conn1 = Nothing
    
    Exit Sub
    
    AdoError:
    i = 1
    On Error Resume Next
    
    ' Enumerate Errors collection and display properties of
    ' each Error object (if Errors Collection is filled out)
    Set Errs1 = Conn1.Errors
    For Each errLoop In Errs1
        With errLoop
            strTmp = strTmp & vbCrLf & "ADO Error # " & i & ":"
            strTmp = strTmp & vbCrLf & " ADO Error # " & .Number
            strTmp = strTmp & vbCrLf & " Description " & .Description
            strTmp = strTmp & vbCrLf & " Source " & .Source
            i = i + 1
        End With
    Next
    
    AdoErrorLite:
    ' Get VB Error Object's information
    strTmp = strTmp & vbCrLf & "VB Error # " & Str(Err.Number)
    strTmp = strTmp & vbCrLf & " Generated by " & Err.Source
    strTmp = strTmp & vbCrLf & " Description " & Err.Description
    
    MsgBox strTmp
    
    ' Clean up gracefully without risking infinite loop in error handler
    On Error GoTo 0
    GoTo Done
End Sub

错误说明

只有 ADO Connection 对象具有错误集合。 观察阅读器将注意到轻型错误处理程序对示例 RecordSet.Open 有效。 如果打开 RecordSet 对象时出错,ADO 应从 OLEDB 提供程序返回最明确的错误。 前面代码可能遇到的一些常见错误会跟在后。

如果省略 (或在连接字符串) DefaultDir 参数时出现错误,您可能会收到以下错误:

ADO 错误 # -2147467259
说明 [Microsoft][ODBC Microsoft Access 97 驱动程序] (未知) "
不是有效路径。 确保路径名称为
拼写正确且已连接到服务器
文件所在的位置。
Source Microsoft OLE DB Provider for ODBC Drivers

如果连接字符串中的 Dbq 参数出错,您可能会收到以下错误:

ADO 错误 # -2147467259 说明 [Microsoft][ODBC Microsoft Access 97 驱动程序] 找不到文件" (未知) "。
Source Microsoft OLE DB Provider for ODBC Drivers

前面的错误还用以下错误填充 Connection 错误集合:

ADO 错误 # -2147467259
说明 [Microsoft][ODBC Driver Manager] 驱动程序
SQLSetConnectAttr 失败
Source Microsoft OLE DB Provider for ODBC Drivers

ADO 错误 # -2147467259
说明 登录失败
Source Microsoft OLE DB Provider for ODBC Drivers

备注

对于每个错误,ADO 错误号是相同的,在这种情况下转换为0x80004005,这是一般E_FAIL错误消息。 基础组件没有遇到条件的特定错误号,但有用的信息从不向 ADO 引发。

参考