• ベストアンサー

【ADO】「Execute」を使うときは「Update」は不要?

Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic cn.Execute "DELETE FROM テーブル1" rs.Update '保存 Set rs = Nothing Set cn = Nothing End Sub を実行したとき テーブル1にデータがあるときはエラーにはならないのですが 何もデータがないときは「rs.Update」でエラーになります。 なので「Update」は消して実行していますが 「Update」がなくても「Execute」を実行した後は自動的に保存されるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.3

Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic cn.Execute "DELETE FROM テーブル1" rs.Update '保存 Set rs = Nothing Set cn = Nothing End Sub は Sub test() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" cn.Execute "DELETE FROM テーブル1" Set cn = Nothing End Sub と変更しても変わりはありません。 データベースの更新を行うだけが目的であるのならば、コピーを作成する必要はありません。 一方、ユーザーの操作を非同期(操作と処理が同時でないこと)で、データベースに反映したい場合にレコードセットを使用した更新を使用します。 Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic 'フォームロードでレコードセットを作成し、ボタン押下で削除するなど '今回は一括削除 Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.close cn.close Set rs = Nothing Set cn = Nothing End Sub

1wer56
質問者

お礼

ありがとうございます。

その他の回答 (2)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

補足です。 レコードセットというのは、実際のデータをプログラムのワークエリアに作成したコピーのことです。 そのため、いくらレコードセットのデータを変更使用とも、実際のデータに変更が反映されません。 それは、レコードセットがただのコピーだからです。 レコードセットを取得した状態で、コネクションをきっても問題ないはずです。 コピー(レコードセット)の更新を実データに反映させるためにUpdateメソッドが存在します。 Updateは実際にはSQL文を、つまりUPDATE文やINSERTまたはDELETE文をExecuteしています。 そのため、「Execute」を使うときは「Update」は不要? という問いへの答えは、Updateによる自動で行われるExecuteを使用するか、自力でExecuteによりSQLを発行するかのどちらかが行われればよいので、不要ですとなります。

1wer56
質問者

お礼

コピーだからADOをデバッグしながら実行してもアクセスでデータの編集が可能なのですね。 ひとつ確認なのですが Executeを使用するときはレコードセットを使用してないのでしょうか? (私が質問したコードは、rsが活用されていない?)

回答No.1

これで動くと思います。 Sub test() Dim cn As ADODB.Connection '''Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" '''Set rs = New ADODB.Recordset '''rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic cn.Execute "DELETE FROM テーブル1" '''rs.Update '保存 '''Set rs = Nothing cn.close Set cn = Nothing End Sub

1wer56
質問者

お礼

rsはいらないのですね! ありがとうございます。