開啟 ADO connection 和 Recordset 物件

本文說明如何開啟 ADO connection 及 Recordset 物件。

原始產品版本:   Sqlserver
原始 KB 編號:   168336

摘要

ActiveX 資料物件 (ADO) 提供數種方式開啟 Connection 及 Recordset 物件。 本文提供每個物件的幾種常見技巧的範例程式碼。

詳細資訊

有幾種方式可以在 ADO 中開啟 Connection 物件:

  • 將此 ConnectionString 屬性設定為有效的連接字串,然後呼叫此 Open() 方法。 此連線字串與提供者相關。
  • 將有效的 Connect 字串傳遞給方法的第一個引數 Open()
  • 將有效的 Command 物件傳遞至 Recordset 的 Open 方法的第一個引數。
  • 將 ODBC 資料來源名稱和選擇性的使用者識別碼和密碼傳遞給 Connection 物件的 Open() 方法。

在 ADO 中開啟 Recordset 物件的方法有三種:

  • 從方法開啟 Recordset Connection.Execute()
  • 從方法開啟 Recordset Command.Execute()
  • 在沒有 Connection 或 Command 物件的情況下開啟 Recordset 物件,並將有效的 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 物件有 errors 集合。 Observant 讀取器會注意到這範例中的輕量錯誤處理常式會生效 RecordSet.Open 。 當您開啟 RecordSet 物件時,ADO 應該會從 OLEDB 提供者傳回最明確的錯誤。 前面的程式碼可能會遇到的一些常見錯誤如下。

如果您省略 (或在 connect 字串中) DefaultDir 參數時,可能會收到下列錯誤:

ADO 錯誤 #-2147467259
描述 [Microsoft] [ODBC Microsoft Access 97 Driver] ' (未知) '
不是有效的路徑。 請確定路徑名稱是
拼寫正確,且已連接至伺服器
檔案所在的位置。
來源 Microsoft OLE DB Provider for ODBC 驅動程式

如果 connect 字串的 Dbq 參數中有錯誤,您可能會收到下列錯誤:

ADO 錯誤 #-2147467259 描述 [Microsoft] [ODBC Microsoft Access 97 Driver] 找不到檔案 ' (未知) '。
來源 Microsoft OLE DB Provider for ODBC 驅動程式

上述錯誤也會填入 Connection errors 集合,但發生下列錯誤:

ADO 錯誤 #-2147467259
描述 [Microsoft] [ODBC 驅動程式管理員] 驅動程式的
SQLSetConnectAttr 失敗
來源 Microsoft OLE DB Provider for ODBC 驅動程式

ADO 錯誤 #-2147467259
描述登入失敗
來源 Microsoft OLE DB Provider for ODBC 驅動程式

注意

針對每個錯誤,ADO 錯誤號碼是相同的,在此情況下,會轉譯為0x80004005,也就是一般 E_FAIL 錯誤訊息。 基礎元件沒有發生之狀況的特定錯誤編號,但是有用的資訊永遠不會比 ADO 提升。

參考