Commandオブジェクトの作成

 Commandオブジェクトは、実行するSQL文や付随するパラメータを保持しているオブジェクトである。SQL文は、CommandTextプロパティに設定し、実際SQLを実行すべき接続先をActiveConnectionに設定する。リスト1のの部分に該当する。
' SQL検索文字列設定
' 「社員」テーブルからすべての項目をSELECT
dbcom.ActiveConnection = dbcn
dbcom.CommandText = "SELECT * FROM 社員"

 本サンプルでは、サンプルデータベースNorthwind.mdbの社員テーブルからレコードを取得するSQLを指定している。接続先には、当然すでにオープンしているConnectionオブジェクトを指定する。

■レコードの取得

 レコードを取得するには、Recordsetオブジェクトを使用する。本サンプルプログラムでは、上記で作成したCommandオブジェクトを実行(Execute)した結果をRecordsetオブジェクトにセットしている。リスト1のの部分が該当する。
' SQL文字列を指定したCommandオブジェクトを用いてレコード取得
Set dbrs = dbcom.Execute

 実はレコードセット取得には、もうひとつ方法がある。この方法では、Commandオブジェクトを使用しない。であれば、この方がいいじゃないかと思われるかもしれないが、後述するストアドプロシージャのキックなどの複雑な操作にもCommandオブジェクトを用いるため、場合ごとに使い分けるよりは統一した方がわかりやすい。一応、例として以下にその方法を示しておく。Recordsetオブジェクトを使ってSQLを発行している。
Dim strSQL As String
        :
' SQL検索文字列設定
' 「社員」テーブルからすべての項目をSELECT
strSQL = "SELECT * FROM 社員"

' カーソルタイプは自由に移動できるように静的カーソルを指定して
' SQL文字列を用いてレコード取得
dbrs.Open strSQL, dbcn, adOpenStatic

■レコードセット取得後の操作

 レコードセットを取得してしまえば、あとはDAOの時と同じようにカーソルの移動などを行なうことができる。本サンプルプログラムでは、EOFに達するまで1レコードずつカーソルを移動してゆき、Excelのセルに表示している。次のレコードに移動するには以下のようにすればよい。
' 次のレコードにカーソルを移動
dbrs.MoveNext 

 また、先頭のレコードにカーソルを移動したい場合は、
' 先頭のレコードにカーソルを移動
dbrs.MoveFirst

と指定すればよい。このように取得したレコードセットからは、自由にデータの参照が行なえる。

■オブジェクトの破棄

 使用済みのオブジェクトは破棄する必要がある。単純にCloseを呼び出しただけではオブジェクトが閉じるだけなので、オブジェクト自体(メモリ含む)を完全に破棄するには、Closeの後で“Nothing”をセットする。本サンプルプログラムでは、dbrs、dbcn、dbcomの3つのオブジェクトを破棄しなければならない。
' Recordsetを閉じる
dbrs.Close

' Recordsetオブジェクトを破棄
Set dbrs = Nothing

' Connectionを閉じる
dbcn.Close

' Connectionオブジェクトを破棄
Set dbcn = Nothing

' Commandオブジェクトを破棄
Set dbcom = Nothing

■ストアドプロシージャを呼び出すには

 SQL Serverなどを用いて大規模なデータベースを扱うためには、ストアドプロシージャは無くてはならない手法である。では、ADOからストアドプロシージャを呼び出して実行する(キックという)ことはできるのだろうか? 答えはYesである。ではどのようにすればよいのだろうか。これは、ストアドプロシージャがパラメータを必要とするか否かで多少手続きが異なるので順を追って説明してゆこう。
 ストアドプロシージャを呼び出すには、Commandオブジェクトを用いる。基本的には、CommandオブジェクトのCommandTypeプロパティにストアドプロシージャを示すadCmdStoredProcを、CommandTextプロパティにストアドプロシージャ名を指定し、Executeを呼び出せばよい。この一番簡単な例がパラメータの付かないストアドプロシージャ呼び出しである。以下の例では、「テスト1」というストアドプロシージャを呼び出す方法を示している。
' Commandオブジェクトを設定
dbcom.ActiveConnection = dbcn
dbcom.CommandType = adCmdStoredProc
dbcom.CommandText = "テスト1"

' ストアドプロシージャをキックし、結果のレコードセットを得る
set dbrs = dbcom.Execute

 このように、ストアドプロシージャを呼び出すためのCommandオブジェクトを用意し実行することで、ストアドプロシージャのキックが可能となる。ただし、これだけではストアドプロシージャにパラメータは引き渡せない。では、パラメータが必要なストアドプロシージャはどのようにすればよいのだろうか。これは、Parameterオブジェクトを用いることにより実現できる。Parameterオブジェクトは、Parametersコレクションの中から番号を用いて何番目のパラメータかを指定して引き出して使用する。以下にその例を示す。 
 この例では、1番目のパラメータに”引数1”という値をセットして、「テスト2」というストアドプロシージャを呼び出している。
' Commandオブジェクトを設定
dbcom.ActiveConnection = dbcn
dbcom.CommandType = adCmdStoredProc
dbcom.CommandText = "テスト2"

' ひとつ目のパラメータに値を設定
dbcom.Parameters.Refresh     ' まず、パラメータをリフレッシュ
dbcom.Parameters(1).Value = "引数1"

' ストアドプロシージャをキックし、結果のレコードセットを得る
set dbrs = dbcom.Execute

 この例が示すように、Parameterオブジェクトは、Commandオブジェクト.Parameters(番号)で取り出すことができる。もし、ストアドプロシージャがパラメータに値を返す処理を行なっているのなら、ストアドプロシージャをキックした後、Parameterオブジェクトを取り出せば内容を確認できる。