この特集のトップページへ
Appendix A:ADOコンポーネントによるデータベースアクセス

見出し A.4 ADODB.Recordsetを使ったデータベースアクセス

 ところで,ADODB.ConnectionオブジェクトのExecuteメソッドを呼び出したときには,ADODB.Recordsetオブジェクトが読み取り専用の前方スクロールタイプカーソルとして返される。よって,ADODB.RecordsetオブジェクトのFieldsコレクションのValueプロパティに値を代入して,データベーステーブルの内容を書き換えることは許されない。

 もし,書き換え可能なADODB.Recordsetオブジェクトを取得したいときには,ADODB.ConnectionオブジェクトのExecuteメソッドを使うのではなく,ADODB.Recordsetオブジェクトを実体化し,そのOpenメソッドを呼び出すという手法をとる。

見出し A.4.1 ADODB.Recordsetオブジェクトを使ってテーブルを開く
 ADODB.Recordsetオブジェクトを使ってテーブルを開く場合,まず,ADODB.Recordsetオブジェクトを次のようにして実体化する。


   Dim objRec As ADODB.Recordset
   Set objRec = CreateObject("ADODB.Recordset")

 次に,ADODB.RecordsetオブジェクトのOpenメソッドを使ってデータベースを開く。


   objRec.Open Source, ActiveConnection, _
               CursorType, LockType, _
               Options

Source
データベースのテーブル名,もしくは実行したいSQL文を指定する。
ActiveConnection
データベースへの接続文字列(ADODB.ConnectionオブジェクトのOpenメソッドの第1引数に与えるものと同じ書式のもの),もしくはOpenメソッドを呼び出して,データベースに接続ずみのADODB.Connectionオブジェクトを指定する。
CursorType
カーソルタイプを指定する。カーソルタイプの詳細については,Chapter1の「●ロック機構」を参照してほしい。具体的には,次のいずれかの定数を指定する。
adOpenForwardOnly 前方スクロールタイプカーソル
adOpenKeySet キーセットカーソル
adOpenDynamic 動的カーソル
adOpenStatic 静的カーソル
LockType
ロックタイプを指定する。ロックタイプの詳細については,Chapter 1の「●ロック機構」を参照してほしい。具体的には,次のいずれかの定数を指定する。
adLockReadOnly 読み取り専用で開く
adLockPessimistic レコード単位の排他的ロック
adLockOptimistic レコード単位の共有的ロック
adLockBatchOptimistic 共有的バッチ更新
Options
Sourceがどのような種類なのかを指定する。テーブル名であればadCmdTable,SQL文であればadCmdTextを指定すればよい(そのほかの指定も可能だが,ここでは省略する)。

 書き込み可能なADODB.Recordsetオブジェクトを開くには,CursorTypeadOpenKeySetもしくはadOpenDynamicを,LockTypeadLockPessimisticもしくはadLockOptimisticを指定する。たとえば,myTableというテーブルを書き込みできるように開くためには,次のようにすればよい。


   objRec.Open "myTable", objCon, adOpenKeySet, adLockPessimistic, adCmdTable
   ※objConは,すでにOpenメソッドで適当なデータベースに接続されている,
    ADODB.Connectionオブジェクトを指す変数であるとする。

見出し A.4.2 レコードを書き込む
 ADODB.RecordsetオブジェクトのOpenメソッドを実行すると,指定したテーブルの内容,もしくは,SQL文の結果がそのADODB.Recordsetオブジェクトに格納される。書き込み可能なカーソルタイプおよびロックタイプで開いたときには,ADODB.Recordsetオブジェクトに対してデータ操作をすることで,データベースのレコードを書き換えることができる。

 レコードを書き換えるのは非常に簡単である。取得したADODB.RecordsetオブジェクトのMoveFirstMoveNextMovePreviousMoveLastの各メソッドを使って,書き換えたいレコードに移動する。そして,ADODB.RecordsetオブジェクトのFieldsコレクションのValueプロパティに,新しい値を書き込めばよい。たとえば,NAMEフィールドの値を書き換えるには,次のようにする。


   objRec.Fields("NAME").Value = "myName"

 ADODB.RecordsetオブジェクトのFieldsコレクションのValueプロパティに値を書き込んだ時点で,そのレコードが編集対象となる.ロックタイプとしてレコード単位の排他的ロック(adLockPessimistic)を指定していた場合には,このときにレコードに対してロックがかかる.

 書き換えが完了したら,ADODB.RecordsetオブジェクトのUpdateメソッドを呼び出して値を更新する。ロックタイプとして,レコード単位の共有的ロック(adLockOptimistic)を指定していた場合には,このときにレコードに対してロックがかかる.


   objRec.Update

 Updateメソッドを呼び出すと,データベースのレコードが実際に書き換えられ,書き換えが終わるとロックは解除される。なお,MoveFirstMoveNextMovePreviousMoveLastメソッドなどを呼び出してレコードを移動した場合には,Updateメソッドを呼び出さなくても自動的にレコードが書き換えられる。

 もし,編集をとりやめたいときには,UpdateメソッドではなくCancelUpdateメソッドを呼び出せばよい。


   objRec.CancelUpdate

 ところで,既存のレコードを書き換えるのではなく,新しいレコードを追加したいこともあるだろう。新しいレコードを追加するには,AddNewメソッドを呼び出す。


   objRec.AddNew

 すると,新しいレコードが作成され,ADODB.Recordsetオブジェクトは新たに作成されたレコードを指す。よって,AddNewメソッドを呼び出したのち,FieldsコレクションのValueプロパティに各フィールドの値を代入し,最後にUpdateメソッドを呼び出せば,レコードを追加することができる。

  COLUMN   自動番号の取得

 場合によっては,データベーステーブルのフィールドを自動番号(Accessでいえば,オートナンバー型)にすることもあるだろう。自動番号の場合,Updateメソッドを呼び出した時点で,そのフィールドに自動番号が格納される。

 データベース処理では,データベースエンジン側で振られた自動番号の値をプログラム側で知りたいことがあるが,その場合には,Updateメソッドを呼び出したのちに,FieldsコレクションのValueプロパティを参照すればよい。

 たとえば,Table A-1に示したIDというフィールドが自動番号だったとしよう。このとき,新しいレコードを書き込むときに,List A-4のようにすれば,データベースエンジン側で降られた自動番号を取得できる。

List A-4 自動番号で新しいレコードを追加する例

  1: 'AddNewメソッドを呼び出して新しいレコードを追加する。
  2: objRec.AddNew
  3: 'フィールドの値を書き込む。
  4: 'IDというフィールドが自動番号である場合,
  5: 'プログラム側では値を書き込まない。
  6: objRec.Fields("NAME") = "myName"
  7: objRec.Fields("TEL") = "03-1234-5678"
  8: 'Updateメソッドを呼び出してデータベースに反映させる。
  9: objRec.Update
 10: 'ここでIDというフィールドを参照すると,
 11: 'データベースエンジン側で降られた自動番号を取得できる。
 12: MsgBox objRec.Fields("ID")

prev Appendix A 5/6 next
本文のトップへ | Appendix Aのトップへ