ADO Connection - Database - Excel 97

Connection
SQL
ADO
DAO
XML
Database
Excel
VBA
VBScript
Tips to handle ADO Connection Object using Excel VBA.
本文を折り畳む 本文を開く

はじめに

ADO の代表的なコンポーネントは、 ADO Recordset と ADO Connection です。 ADO Connection Object を使えば、データベース に対する SQL 文の発行を Excel VBA から行うことができます。

実例

データベースへの接続方法を記述する ConnectionString (接続文字列) は ADO Recordset の時と全く同じです。説明はそちらに譲り、ここでは、最も単純な DSN を使う記述を利用して解説します。

ADO のバージョン

  1. 次のコードは、ADO のバージョンを返します。 ADO は未だ発展途上にあり、バージョンによって、サポートする機能が大きく異なります。
    Sub ado12()
        Dim Con1 As Object
        Set Con1 = CreateObject("ADODB.Connection")
        MsgBox Con1.Version
        Set Con1 = Nothing
    End Sub
    

Recordset を返す SQL の実行

  1. ADO Connection Object の Execute メソッドで SQL の Select 文を実行します。
    Sub ado13()
        Dim Source As String, Con As String
        Dim Con1 As Object, Rs1 As Object
        Dim FieA As Object, a As String
        a = ""
        Source = "Select * From Table1"
        Con = "DSN=db1;"
        Set Con1 = CreateObject("ADODB.Connection")
        Con1.ConnectionString = Con
        Con1.Open
        Set Rs1 = Con1.Execute(Source)
        If Not Rs1.EOF Then
            For Each FieA In Rs1.Fields
                a = a & "<" & FieA.Name & ">" & FieA.Value
            Next FieA
        End If
        Rs1.Close
        Set Rs1 = Nothing
        Con1.Close
        Set Con1 = Nothing
        MsgBox a
    End Sub
    
    Execute の結果は Recordset を返します。ただし ADO Recordset とは異なり、カーソルの種類を指定することはできません。得られる Recordset は常に、前方スクロール型の静的カーソルです。

Recordset を返さない SQL の実行

  1. ADO Connection Object の Execute メソッドで SQL によるデータ更新を実行します。
    Sub ado14()
    ' ADO Connection で データを更新する。
        Dim Source As String, Con As String
        Dim Con1 As Object
        Dim FieA As Object
        Source = "Insert Into Table1(Namae) Select '五右衛門'"
        Con = "DSN=db1;"
        Set Con1 = CreateObject("ADODB.Connection")
        Con1.ConnectionString = Con
        Con1.Open
        Con1.Execute Source
        Con1.Close
        Set Con1 = Nothing
    End Sub
    
  2. データを更新する SQL が指定された場合、Execute メソッドはレコードセットを返しません。一般に、動的カーソルを持つ Recordset を開いて、フィールドごと、レコードセットごとに値を更新するよりも、 SQL 文で一括して行う方が効率が良いデータ更新が可能です。また、コードのミスによる不具合も出にくいでしょう。上のコードの SQL 文を、次のように変えるだけで、挿入、削除、値の変更を行うことができます。
    ' 挿入
        Source = "Insert Into Table1(Namae) Select '五右衛門'"
    
    ' 削除
        Source = "Delete From Table1 Where Namae = '五右衛門'"
    
    ' 更新
        Source = "Update Table1 Set Namae = '五右衛門' Where ID = 5"
    
  3. Execute メソッドの第二引数は、Long 値を返します。これを調べれば、 SQL 文によって変更されるレコード数を知ることができます。第三引数には実行時のオプションを指定でき、 Recordset を返さない SQL の実行効率を上げるなら、 adExecuteNoRecords(0x80) を指定します。
        Const adExecuteNoRecords = &H80
        Dim i As Long
        Con1.Execute Source, i, adExecuteNoRecords
        MsgBox i
    

SQL による読み書きの混在

  1. 次のようにして、 Select 文も Update 文等も区別せず実行できる関数を作ることができます。
    Sub ado15(Source As String)
        Dim Con As String
        Dim Con1 As Object, Rs1 As Object
        Dim FieA As Object, a As String, i As Long
        a = ""
        Con = "DSN=db1;"
        Set Con1 = CreateObject("ADODB.Connection")
        Con1.ConnectionString = Con
        Con1.Open
        Set Rs1 = Con1.Execute(Source, i)
        If i > 0 Then
            a = i & " 件のレコードが更新されました。"
        ElseIf Rs1.EOF Then
            a = "該当するデータはありません。"
            Rs1.Close
        Else
            For Each FieA In Rs1.Fields
                a = a & "<" & FieA.Name & ">" & FieA.Value
            Next FieA
            Rs1.Close
        End If
        Set Rs1 = Nothing
        Con1.Close
        Set Con1 = Nothing
        MsgBox a
    End Sub
    
    この関数は、引数として与えられた SQL 文を実行します。 Select 文でも Update や Delete 等でも実行できます。更新型の SQL 実行時でも、 Execute メソッドは、厳密には何も返さないのではなく、閉じた Recordset を返しています。また、第二引数には、 Select 文の場合 -1 が格納されます。これを利用して動作を切り替えています。
  2. 上の関数を使って、各種 SQL を実行するサンプルです。
    Sub ado16()
        ado15 "select * from Table1 where id=1"
        ado15 "select * from Table1 where id=0"
        ado15 "Insert Into Table1(Namae) Select '五右衛門'"
    End Sub
    
    データベースを効率的に使うという観点では、このサンプルは失格です。同じデータベースに続けてアクセスするなら、都度、接続を切るべきではありません。連続して SQL 文を実行する上手な方法については、トランザクションのところで解説します。

Download a Sample Code

上記の解説で用いたサンプルコードは、以下のリンクからダウンロードできます。テキストファイルとして用意しているので、保存して Excel の Visual Basic Editor にインポートしてください。
  1. Save a program source (sample-vbaxlado2-1.bas) on your local disk.
  2. Start Microsoft Excel with a blank(new) book.
  3. Open the Visual Basic Editor. (Tool/Macro/Visual Basic Editor)
  4. Import the downloaded program source. (File/Import Files)

History

2002/3/24
URL移転
2001/4/17
sample-vbaxlado2-1.bas released
2001/4/17
初版
本文を折り畳む back to home index of VBA