Function ado1(Con As String, SQL As String)
Const adOpenForwardOnly = 0
Dim Rs1 As Object, FieA As Object
Dim a As String
a = ""
Set Rs1 = CreateObject("ADODB.Recordset")
Rs1.Open SQL, Con, adOpenForwardOnly
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
ado1 = a
End Function
記述方法の理解は後に回すとして、この段階では、接続文字列 Con にはデータベースへの接続に必要な情報、SQL 文字列には、接続したデータベース上で、目的のデータを検索するために必要な情報が、それぞれ記述されていると考えてください。この 2 つが、 ADO の Recordset Object を得るために必要な情報です。
Rs1.Open SQL, Con, adOpenForwardOnly
Open メソッドでは、引数を 3 つ指定していますが、順に、SQL、接続文字列、カーソルタイプです。レコードセットを得る場合に使用する SQL は Select 文です。これは、使用するデータベースに合わせて記述します。接続文字列は、データベースの種類や物理的な所在地を特定するための情報で、使用する環境に依存したものになります。第三引数のカーソルタイプは、レコードセットを読むだけなのか、書きこむのか、といったような、操作の種類に応じたものを指定します。ここでは、読み込み専用でパフォーマンスのよい adOpenForwardOnly (0) を指定しています。
Sub ado5()
Const adOpenForwardOnly = 0
Dim Source As String, Con As String
Dim Rs1 As Object, FieA As Object
Dim x As Range, y As Range
Set x = ActiveCell
Set y = x.EntireColumn
Con = "DSN=db1;"
Source = "Select * From Table1 WHERE ID Between 1 And 10"
Set Rs1 = CreateObject("ADODB.Recordset")
Rs1.Open Source, Con, adOpenForwardOnly
For Each FieA In Rs1.Fields
x.Value = FieA.Name
Set x = x.Next
Next FieA
Set x = Intersect(x.Rows(2).EntireRow, y)
Do Until Rs1.EOF
For Each FieA In Rs1.Fields
x.Value = FieA.Value
Set x = x.Next
Next FieA
Set x = Intersect(x.Rows(2).EntireRow, y)
Rs1.MoveNext
Loop
Rs1.Close
Set Rs1 = Nothing
End Sub
コンポーネントを呼び出す Set Rs1 = CreateObject("ADODB.Recordset")
レコードセットを取り出す Rs1.Open SQL, Con, adOpenForwardOnly
最終レコードの時、真 Rs1.EOF
フィールドコレクション Rs1.Fields
フィールドオブジェクト Rs1.Fields("Name1") 名前で指定
フィールドオブジェクト Rs1.Fields(0) 番号で指定
フィールドを取り出す For Each FieA In Rs1.Fields
フィールド名 FieA.Name
フィールドの値 FieA.Value
次のレコードへ移動 Rs1.MoveNext
レコードセットを閉じる Rs1.Close
Set Rs1 = Nothing
Rs1.Open Source, Con, adOpenDynamic, adLockOptimistic
書きこみはレコード単位で行います。新規追加、変更、削除、いずれの場合でも、操作を行った後、カーソルを次のレコードに移動する前に、 Update メソッドを打って、変更を確定させます。
Rs1.Update
Sub ado6()
Const adOpenDynamic = 2
Const adLockOptimistic = 3
Dim Source As String, Con As String
Dim Rs1 As Object
Con = "DSN=db1;"
Source = "Select * From Table1 WHERE ID = 3"
Set Rs1 = CreateObject("ADODB.Recordset")
Rs1.Open Source, Con, adOpenDynamic, adLockOptimistic
Rs1.Fields("Hiduke").Value = Now()
Rs1.Update
Rs1.Close
Set Rs1 = Nothing
End Sub
Sub ado7()
Const adOpenDynamic = 2
Const adLockOptimistic = 3
Dim Source As String, Con As String
Dim Rs1 As Object
Con = "DSN=db1;"
Source = "Select * From Table1 WHERE ID = 3"
Set Rs1 = CreateObject("ADODB.Recordset")
Rs1.Open Source, Con, adOpenDynamic, adLockOptimistic
Rs1.addnew
Rs1.Fields("Hiduke").Value = Now()
Rs1.Update
Rs1.Close
Set Rs1 = Nothing
End Sub
Sub ado8()
Const adOpenDynamic = 2
Const adLockOptimistic = 3
Dim Source As String, Con As String
Dim Rs1 As Object
Con = "DSN=db1;"
Source = "Select * From Table1 WHERE ID = 3"
Set Rs1 = CreateObject("ADODB.Recordset")
Rs1.Open Source, Con, adOpenDynamic, adLockOptimistic
Rs1.Delete
Rs1.Update
Rs1.Close
Set Rs1 = Nothing
End Sub
レコードセットを取り出す Rs1.Open Source, Con, adOpenDynamic, adLockOptimistic 新しいレコードを追加する Rs1.Addnew 現在のレコードを削除する Rs1.Delete 現在のレコードを更新する Rs1.Update
'---- CursorTypeEnum Values ---- Const adOpenForwardOnly = 0 Const adOpenKeyset = 1 Const adOpenDynamic = 2 Const adOpenStatic = 3 '---- LockTypeEnum Values ---- Const adLockReadOnly = 1 Const adLockPessimistic = 2 Const adLockOptimistic = 3 Const adLockBatchOptimistic = 4 '---- DataTypeEnum Values ---- Const adChapter = 136ADO がインストールされているフォルダーの中に adovbs.inc というテキストファイルがあり、その中に ADO で必要な定数が定義されています。
Sub ado2()
Dim Source As String, Con As String
Source = "select * from Table1 where c=6"
' Microsoft OLE DB Provider for Microsoft Jet
Con = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\opt\access1.mdb;User ID=Admin;Password=;"
MsgBox ado1(Con, Source)
' Microsoft OLE DB Provider for ODBC
' DSN を使う記述
Con = "Provider=MSDASQL;DSN=db1;UID=Admin;PWD=;"
MsgBox ado1(Con, Source)
' ODBC はデフォルトプロバイダーなので省略記述できる。
Con = "DSN=db1;"
MsgBox ado1(Con, Source)
' FileDSN を使う記述
Con = "FileDSN=fdb1;"
MsgBox ado1(Con, Source)
' Driver を使う記述
Con = "Driver={Microsoft Access Driver (*.mdb)};" & _
"UID=Admin;PWD=;DBQ=C:\opt\access1.mdb;"
MsgBox ado1(Con, Source)
' フォーマルな記述(1)
Con = "Provider=MSDASQL;Extended Properties=""" & _
"Driver={Microsoft Access Driver (*.mdb)};" & _
"DBQ=C:\opt\access1.mdb;DefaultDir=C:\opt;Exclusive=0;" & _
"FIL=MS Access;MaxBufferSize=512;PageTimeout=5;ReadOnly=1;" & _
"UID=Admin;PWD=;"""
MsgBox ado1(Con, Source)
' フォーマルな記述(2)
Con = "Provider=MSDASQL;Persist Security Info=False;" & _
"Extended Properties=""DSN=MS Access 97 Database;" & _
"DBQ=C:\opt\access1.mdb;DefaultDir=C:\opt;DriverId=25;" & _
"Exclusive=0;FIL=MS Access;MaxBufferSize=512;PageTimeout=5;" & _
"ReadOnly=1;UID=Admin;"""
MsgBox ado1(Con, Source)
' UDL (Universal Data Link) File を使う記述
Con = "File Name=C:\opt\db1.udl;"
MsgBox ado1(Con, Source)
End Sub
MsgBox ado1( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\opt\access1.mdb; User ID=Admin;Password=;" , "select * from Table1 where c=6")Microsoft Jet は、代表的な OLE DB コンポーネントです。これがインストールされていない場合は、Microsoft Universal Data Access 関連ダウンロード のページからダウンロードできます。 Provider= の部分に、使用する OLE DB コンポーネントを指示し、 Data Source= に、データベースの物理的な場所を示すための情報を与えます。Jet の場合は、MDB ファイルへの物理パスです。このように、複数のプロパティを ; (セミコロン)で区切って、1つの文字列にして渡すというのが、接続文字列の基本的な記述方式です。
MsgBox ado1("File Name=C:\opt\db1.udl;"
, "select * from Table1 where c=6")
UDL ファイルを作成すれば、OLE DB プロバイダーへの接続文字列を手軽に扱えます。事前に接続テストの実行もできるため、記述ミスによるエラーを軽減できます。 UDL ファイルをカレントディレクトリー(コンポーネントと同じディレクトリー) に配置した場合には、上記の例より単純に、パスを省略して記述できます。
[oledb] ; Everything after this line is an OLE DB initstring Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\opt\Access1.mdb; Persist Security Info=FalseUDL ファイルは、上の例のような、接続文字列を記述したテキストファイルです。 Microsoft データリンクのプロパティ画面で作成することができます。
MsgBox ado1("Provider=MSDASQL;DSN=db1;UID=Admin;PWD=;"
, "select * from Table1 where c=6")
OLE DB から ODBC ドライバーに引き渡す方法を利用すれば、 ODBC で利用可能なデータベース資源がすべて利用できるようになります。上のコードは、ODBC のシステム DSN に登録されているデータソース名 db1 を利用するものです。ユーザー名の記述が User ID= でなく UID= になっていますが、DSN= 以降の接続文字列はすべて、 OLE DB ではなく ODBC 側で処理されます。
MsgBox ado1("DSN=db1;"
, "select * from Table1 where c=6")
ADO のデフォルト OLE DB Provider は ODBC です。そのため、 Provider=MSDASQL の記述を省略することができます。システム DSN の登録時にユーザーID やパスワードを埋め込むこともできますから、最も簡単な記述は DSN= を指定するだけです。
MsgBox ado1("FileDSN=fdb1;"
, "select * from Table1 where c=6")
システム DSN の代わりにファイル DSN を使う場合は、上のようになります。
MsgBox ado1(
"Driver={Microsoft Access Driver (*.mdb)};
UID=Admin;PWD=;DBQ=C:\opt\access1.mdb;"
, "select * from Table1 where c=6")
ODBC の DSN を利用せず、必要な情報をすべて、その場で与える場合には、上のような記述になります。 Driver= で ODBC ドライバーの名称を正確に記述し、 DBQ= でデータベースの物理的な所在を与えます。ODBC ドライバーにはもっと多くのパラメーターを渡すことができます。それらを指定する必要があれば、上の接続文字列はもっと長くなります。
MsgBox ado1(
"Provider=MSDASQL;Extended Properties=""
Driver={Microsoft Access Driver (*.mdb)};
DBQ=C:\opt\access1.mdb;DefaultDir=C:\opt;Exclusive=0;
FIL=MS Access;MaxBufferSize=512;PageTimeout=5;ReadOnly=1;
UID=Admin;PWD=;"""
, "select * from Table1 where c=6")
MsgBox ado1(
"Provider=MSDASQL;Persist Security Info=False;
Extended Properties=""DSN=MS Access 97 Database;
DBQ=C:\opt\access1.mdb;DefaultDir=C:\opt;DriverId=25;
Exclusive=0;FIL=MS Access;MaxBufferSize=512;PageTimeout=5;
ReadOnly=1;UID=Admin;"""
, "select * from Table1 where c=6")
公式通りの記述をすれば、上のようにとても長い接続文字列ができあがります。 ODBC ドライバーのための設定は、 Extended Properties= に一括して与えます。これらを一まとめにするために、" (ダブルコーテーション) が利用されます。上のコードでは、文字列の中に入る " をエスケープするために二重に記述しています。
Sub ado3()
Dim Source As String, Con As String
Source = "select * from Table1 where c=6"
' ODBC Excel Driver
' C:\opt\Book1.xls にある "Table1"という名前の Range を扱う。
' Souce = "A1:C3" というように Range の直接指定も可能。
Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\opt\Book1.xls;"
MsgBox ado1(Con, Source)
' ODBC Text Driver
' C:\opt\Table1 というテキストファイルを扱う。
Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=C:\opt;"
MsgBox ado1(Con, Source)
End Sub
Sub ado4()
Dim Source As String, Con As String
Source = "select * from Table1 where c=6"
' Microsoft OLE DB Provider for Oracle
Con = "Provider=MSDAORA;Data Source=serverName;" & _
"User ID=userName; Password=userPassword;"
MsgBox ado1(Con, Source)
' ODBC
Con = "Driver={Oracle ODBC Driver};" & _
"UID=userName;PWD=userPassword;DBQ=serviceName"
MsgBox ado1(Con, Source)
End Sub
Sub ado10()
Const adOpenForwardOnly = 0
Dim Source As String, Con As String
Dim x As Range, Rs1 As Object
Set x = ActiveCell
' Microsoft OLE DB Simple Provider
' XML ファイルを、入れ子の Recordset として返す。
' データソースは、ファイル名または URL を指定する。
Source = "C:\opt\table1.xml"
Source = "http://someurl/opt/table1.xml"
Con = "Provider=MSDAOSP; Data Source=MSXML2.DSOControl;"
Set Rs1 = CreateObject("ADODB.Recordset")
Rs1.Open Source, Con, adOpenForwardOnly
ado11 Rs1, x
Rs1.Close
Set Rs1 = Nothing
End Sub
Function ado11(Rs1 As Object, x As Range) As Range
' ADO-XML レコードセットをセルに書き出す。
Const adChapter = 136
Dim FieA As Object, Rs2 As Object
Dim i As Long
i = 1
Do While Not Rs1.EOF
For Each FieA In Rs1.Fields
If FieA.Type = adChapter Then
Set Rs2 = FieA.Value
Set x = ado11(Rs2, x(i + 1, 2))(2, 0)
i = 1
Set Rs2 = Nothing
Else
x(i) = FieA.Name
x(i, 2) = FieA.Value
i = i + 1
End If
Next
Rs1.MoveNext
Loop
Set ado11 = x(i)
End Function
上のコードは、 XML ファイルを開いて、レコードセットのようにセル上に展開します。