データの更新には一般的にINSERT文、UPDATE文、DELETE文といった SQL を使う。
しかし ADO の Recordset はデータの更新機能を持っているので、SQL を使わずにデータの更新ができる。
データの追加方法
AddNew でレコードセットにレコードを追加し、Update でテーブルに反映する。
Dim rst Set rst = CreateObject("ADODB.Recordset") 'テーブル名を指定してレコードセットを開く rst.Open "DEPT", _Oracle;User ID=scott;Password=tiger;Data Source=ORCL;", _ "Provider=OraOLEDB. 3, _ 3 'レコードを追加 rst.AddNewValue = "50" rst.Fields("DEPTNO").Value = "NEWDEPT" rst.Fields("DNAME").Value = "" rst.Fields("LOC"). '変更を反映 rst.Update
変更をキャンセルしたいときは CancelUpdate を実行する。
Update も CancelUpdate もせずに Close するとエラーが起きる。
0x800a0c93 - ADODB.Recordset: このコンテキストで操作は許可されていません。
2レコードを一度に Update できるかと思ったが、AddNew を実行したタイミングで1レコード目がテーブルに反映された。
'1レコード目 rst.AddNewValue = "51" rst.Fields("DEPTNO").Value = "NEWDEPT-51" rst.Fields("DNAME").Value = "CAMBRIDGE" rst.Fields("LOC"). '2レコード目 rst.AddNew '←の実行で上記のレコードが追加されたValue = "52" rst.Fields("DEPTNO").Value = "NEWDEPT-52" rst.Fields("DNAME").Value = "BROOKLINE" rst.Fields("LOC"). 'テーブルに反映 rst.Update
レコードセットを開くとき、テーブル名ではなくクエリを指定してもよい。
データの更新方法
更新したいカラムの値を変更して Update を実行する。
レコードセットが複数件の場合、更新対象をループで探してから更新する。
次のように書くと、DEPTNO が “50” のレコードのカラム LOC を “QUINCY” に更新する。
データ追加と同様に、変更をなかったことにするときは Update ではなく CancelUpdate を実行する。
データの削除方法
削除するレコードで Delete を実行する。
レコードセットが複数件の場合、削除対象をループで探してから削除する。
次のように書くと、DEPTNO が “50” のレコードを削除する。
rst.MoveFirst Do While Not rst.EOFValue = "50" Then If rst.Fields("DEPTNO"). rst.Delete End If rst.MoveNext Loop
Recordset.LockType プロパティの設定
LockType プロパティは既定で 1:adLockReadOnly になる。
読み取り専用となりデータの変更ができないので別の値にしておく。
今回は 3:adLockOptimistic にした。
これはレコード単位の共有的ロックを表し、Update メソッドの呼び出し時(データの反映時)にのみレコードをロックする動きとなる。
ちなみに LockType が 1:adLockReadOnly のときに AddNew を呼び出すとエラーになる。
0x800a0cb3 - ADODB.Recordset: 現在の Recordset は更新をサポートしていません。プロバイダーか、選択されたロックタイプの限界の可能性があります。
Recordset.CursorType プロパティの設定
CursorType プロパティがキーセットカーソル(1:adOpenKeyset)でも静的カーソル(3:adOpenStatic)でもない場合は、プログラムから AddNew で追加したレコードをそのプログラム内で参照/操作することができない。
既定値は前方スクロール カーソル(0:adOpenForwardOnly)なので、必要に応じて設定を変更しておく。
'レコードを追加 rst.AddNewValue = "50" rst.Fields("DEPTNO").Value = "NEWDEPT" rst.Fields("DNAME").Value = "" rst.Fields("LOC"). rst.Update 'レコードセットのデータを全件表示 ' ★キーセットカーソル、または静的カーソルの場合のみ、上記で追加したレコードが表示される rst.MoveFirst Do While Not rst.EOFValue & vbTab & rst.Fields("DNAME").Value & vbTab & rst.Fields("LOC").Value WScript.Echo rst.Fields("DEPTNO"). rst.MoveNext Loop