この特集のトップページへ
>
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オブジェクトを開くには,CursorTypeにadOpenKeySetもしくはadOpenDynamicを,LockTypeにadLockPessimisticもしくは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オブジェクトのMoveFirst,MoveNext,MovePrevious,MoveLastの各メソッドを使って,書き換えたいレコードに移動する。そして,ADODB.RecordsetオブジェクトのFieldsコレクションのValueプロパティに,新しい値を書き込めばよい。たとえば,NAMEフィールドの値を書き換えるには,次のようにする。
objRec.Fields("NAME").Value = "myName"
ADODB.RecordsetオブジェクトのFieldsコレクションのValueプロパティに値を書き込んだ時点で,そのレコードが編集対象となる.ロックタイプとしてレコード単位の排他的ロック(adLockPessimistic)を指定していた場合には,このときにレコードに対してロックがかかる.
書き換えが完了したら,ADODB.RecordsetオブジェクトのUpdateメソッドを呼び出して値を更新する。ロックタイプとして,レコード単位の共有的ロック(adLockOptimistic)を指定していた場合には,このときにレコードに対してロックがかかる.
objRec.Update
Updateメソッドを呼び出すと,データベースのレコードが実際に書き換えられ,書き換えが終わるとロックは解除される。なお,MoveFirst,MoveNext,MovePrevious,MoveLastメソッドなどを呼び出してレコードを移動した場合には,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 自動番号で新しいレコードを追加する例
|
Appendix A 5/6 | ||
本文のトップへ | Appendix Aのトップへ |