■ ADOレコードセットを操作しよう!1
前回までADO(Active Data Object)によるレコードセットの取得の仕方を解説しました。
レコードセットは、ただ取得するだけではデータベースに対して何も処理は行えません。
今回は取得したレコードセットに対する様々な操作を解説します。
ADOによるレコードセットへの操作は主に次のような処理が可能です。
・レコードの追加 ・レコードの削除
・レコードの検索 ・レコードの抽出
・レコードの移動 ・レコードの取得
・レコードの並べ替え
ADOには7種類のオブジェクトが用意されています。
Connection |
データベースへの接続を表します |
Command |
データベースに対して実行数るコマンドを保持します |
Parameter |
クエリやSQLステートメントのパラメータを保持します |
Property |
各ADOオブジェクトのプロパティを保持します |
Recordset |
レコードセット(データの集まり)を保持します |
Field |
レコードセットを構成するフィールドを保持します |
Error |
データアクセスに関連したエラーを保持します |
この中でもっとも頻繁に参照されるのはフィールドオブジェクトです。フィールドを参照するにはインデックス番号を使用する方法とオブジェクト名を使用する方法があります。
例: |
|
|
|
0 |
1 |
2 |
3 |
SyainID |
SyainNAME |
Kinzoku |
Syozoku |
10001 |
山田 太郎 |
25 |
営業一課 |
10002 |
鈴木 一郎 |
10 |
営業二課 |
… |
… |
… |
… |
SyainIDフィールドを参照する記述例。次のどの記述法でもSyainIDのフィールドを参照します。
・RS.Fields(0)
・RS.Fields("SyainID")
・RS.Fields!SyainID
・RS("SyainID")
・RS!SyainID
レコードセットオブジェクトを作成する
レコードセットを取得するOpenメソッドの書式を解説します。
書式: Recordset.Open Source, ActiveConnection, CursorType, LockType, option
Recordset |
取得するRecordsetオブジェクト |
Source |
SQLステートメント、テーブル名、クエリ名を指定します |
ActiveConnection |
Connectionオブジェクトまたは接続情報文字列を指定します |
CursorType |
カーソルタイプを決めるための定数を指定します |
LockType |
ロックタイプを決めるための定数を指定します |
Options |
プロバイダがSource 引数を評価する方法を指定します |
※ カーソルタイプとロックタイプの詳細はこちらを参照してください。
エクセルのワークシートに接続してみよう!
レコードセットに編集、追加、削除を行うにはOpenメソッドの引数に編集可能な定数を指定する必要があります。
例:
RS.Open SQL, CN, adOpenKeyset, adLockOptimistic
レコードセットオブジェクトは同時に複数のレコードを参照することができません。参照できるレコードは1つです。このレコードのことをカレントレコードと呼びます。
レコードセットを作成したとき、カレントレコード(カーソル位置)は先頭レコードになります。
BOFとEOFプロパティ
BOFは"Begin Of File"、EOFは"End Of File"の略で、カレントレコードが移動できる範囲を表します。
たとえばレコード1から順番にレコードを参照していき、EOFプロパティがTRUEになったとき、レコードセットのこれ以上後方にレコードが存在しないことを示します。
レコードセット
BOF BOF=True、 EOF=False
レコード1 BOF=False、EOF=False
レコード2 BOF=False、EOF=False
レコード3 BOF=False、EOF=False
… … …
EOF BOF=False、EOF=True
カレントレコードを移動する
書式:
Recordset.MoveFirst |
先頭レコードに移動します |
Recordset.MovePrevious |
1つ前のレコードに移動します |
Recordset.MoveNext |
次のレコードに移動します |
Recordset.MoveLast |
最終レコードに移動します |
Recordset.Move n |
指定数"n"のレコードに移動します |
例:
次の例では取得したレコードセットの先頭レコードから最終レコードまで、指定されたフィールドの値を出力します。
Do
Debug.Print RS.Fields("SyainNAME") & "/" & RS.Fields("Syozoku")
RS.MoveNext
Loop Until RS.EOF
レコードを更新(変更・編集)する
書式: Recordset.Update Fields, Values
Recordset |
取得したレコードセットオブジェクト |
Fields |
編集するフィールド |
Values |
フィールドに代入する値 |
例:
次の例では、フィールドオブジェクトのValueプロパティに値を代入し、Updateメソッドでレコードセットを更新しています。
RS.Fields("SyainNAME") = "山田太郎"
RS.Fields("Syozoku") = "営業一課"
RS.Update
次の例では、取得したレコードセットの全てのレコードに対して、勤続年数を加算しています。
Do
RS.Fields("Kinzoku") = RS.Fields("Kinzoku") + 1
RS.Update
RS.MoveNext
Loop Until RS.EOF
※ Updateメソッドを呼び出す前に、カレントレコードを移動すると、自動的にUpdateが呼び出され、変更が保存されます。ですので、RS.Updateを記述しなくてもRS.MoveNextを実行した時点で、テーブルフィールドに変更された値が保存されます
新規レコードを追加(登録)する
書式: Recordset.AddNew
Field1 = Value1
Field2 = Value2
Field3 = Value3
・・・・・・
Recordset.Update
Recordset |
取得したレコードセットオブジェクト |
Field |
新規で追加するレコードのフィールド名 |
Value |
フィールドに代入する値 |
例:
次の例では、AddNewメソッドでレコードの追加を宣言し、フィールドオブジェクトに値を代入、Updateメソッドでレコードセットを更新しています。
RS.AddNew
RS.Fields("SyainNAME") = "山田太郎"
RS.Fields("Syozoku") = "営業一課"
RS.Update
(注)
・AddNewメソッド実行後は、そのレコードがカレントレコードになります。Updateメソッドを呼び出した後もそのままカレントレコードとなります。
・Value引数は、代入するフィールドがテキスト型の場合はダブルクォーテーション、日付時刻型の場合はシャープで囲みます。数値型の場合はそのままの値で記述します。
・値を代入しなかったフィールドには、Null値が入ります。テーブルのフィールドプロパティでNull値を許可しないフィールドの場合にはエラーが発生します。
レコードを削除する
書式: Recordset.Delete
Recordset |
取得したレコードセットオブジェクト |
例:
次の例では、取得したレコードセットのカレントレコードを削除します。
RS.Delete
次の例では、取得したレコードセットの全てのレコードを削除します。
Do
RS.Delete
RS.MoveNext
Loop Until RS.EOF
(注)
・Deleteメソッドが削除するのはあくまでカレントレコードです。1件のレコードを削除する場合は、MoveメソッドやFindメソッドを使用して、削除するレコードにカレントレコードを移動するか、SQLステートメントで削除する対象のレコード1件のみをレコードセットとして取得するようにします。
・削除したカレントレコードは、別のレコードに移動するまでそのままカレントレコードとなります。
次回も引き続き、ADOレコードセットの操作について解説します。
|