ADO 接続と Recordset オブジェクトを開く

この記事では、ADO 接続と Recordset オブジェクトを開く方法について説明します。

元の製品バージョン: SQL Server
元の KB 番号: 168336

概要

ActiveX データ オブジェクト (ADO) には、Connection オブジェクトと Recordset オブジェクトの両方を開く方法がいくつか用意されています。 この記事では、オブジェクトごとにいくつかの一般的な手法のサンプル コードを示します。

詳細

ADO 内で Connection オブジェクトを開くには、いくつかの方法があります。

  • プロパティを ConnectionString 有効な接続文字列に設定し、 メソッドを Open() 呼び出します。 この接続文字列はプロバイダーに依存します。
  • 有効な Connect 文字列を メソッドの最初の引数に Open() 渡すこと。
  • 有効な Command オブジェクトを Recordset の Open メソッドの最初の引数に渡すこと。
  • ODBC データ ソース名と必要に応じて、ユーザー ID とパスワードを Connection オブジェクトの Open() メソッドに渡します。

ADO 内で Recordset オブジェクトを開くには、次の 3 つの方法があります。

  • メソッドから Recordset を Connection.Execute() 開きます。
  • メソッドから Recordset を Command.Execute() 開きます。
  • Connection オブジェクトまたは Command オブジェクトを使用せずに Recordset オブジェクトを開き、有効な Connect 文字列を メソッドの 2 番目の引数に 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 コレクションがあります。 観察者のリーダーは、軽量のエラー ハンドラーが例に対して RecordSet.Open 有効であることを確認します。 RecordSet オブジェクトを開くときにエラーが発生した場合、ADO は OLEDB プロバイダーから最も明示的なエラーを返す必要があります。 前のコードで発生する可能性がある一般的なエラーをいくつか次に示します。

接続文字列で DefaultDir パラメーターを省略した場合 (またはエラーが発生した場合)、次のエラーが発生する可能性があります。

ADO エラー # -2147467259
説明 [Microsoft][ODBC Microsoft Access 97 Driver] '(unknown)'
は有効なパスではありません。 パス名が
スペルが正しく、サーバーに接続されていること
ファイルが存在する。
ソース Microsoft OLE DB Provider for ODBC ドライバー

接続文字列の Dbq パラメーターにエラーが発生した場合は、次のエラーが発生する可能性があります。

ADO エラー # -2147467259 説明 [Microsoft][ODBC Microsoft Access 97 Driver] ファイル '(unknown)' が見つかりませんでした。
ソース Microsoft OLE DB Provider for ODBC ドライバー

上記のエラーでは、接続エラー コレクションにも次のエラーが設定されます。

ADO エラー # -2147467259
説明 [Microsoft][ODBC ドライバー マネージャー] ドライバーの
SQLSetConnectAttr が失敗しました
ソース Microsoft OLE DB Provider for ODBC ドライバー

ADO エラー # -2147467259
説明 ログインに失敗しました
ソース Microsoft OLE DB Provider for ODBC ドライバー

注:

エラーごとに ADO エラー番号は同じです。この場合、0x80004005に変換されます。これは一般的なE_FAILエラー メッセージです。 基になるコンポーネントには、検出された条件に対する特定のエラー番号がありませんでしたが、有用な情報は ADO にまったく発生しませんでした。

関連情報