- 締切済み
access adoのトランザクション
access2003でSQLServer2008へのリンクテーブルを作成し、 vbaでadoを使ってデータ更新処理をしようとしています。 以下のように記述していますが、 実行後、BやCのテーブルが開かなくなります。 (正確にはインサートしたデータが表示されるであろうページがロックされているような動きです。) また、その状態からAccessを一旦終了し、再度起動すると、データがインサートされていない状態です。 コミットが効いてないように感じます。 こちら原因としてどんなことが考えられるでしょうか? ちなみにDAOで動かしても同様でした。 宜しくお願い致します。 以下 コード============================ Set cn = CurrentProject.Connection Set rst = New ADODB.Recordset cn.BeginTrans rst.Open "select key from A", cn, adOpenForwardOnly, adLockReadOnly Do Until rst.EOF cne.Execute "insert into B ( aa, bb) select aa, bb from A where key = " & rst!key & " " cne.Execute "insert into C ( aa, bb) select aa, bb from A where key = " & rst!key & " " rst.MoveNext Loop rst.Close cn.CommitTrans cn.Close set rst = Nothing set cn = Nothing
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nofx35
- ベストアンサー率82% (14/17)
確認ですが、 トランザクションを掛けているConnectionはcn インサートを行っているConnectionはcneになっていますが これは投稿時の間違いですか?
- ShowMeHow
- ベストアンサー率28% (1424/5027)
シロウトなので、詳しいことは知らないので憶測だけど コミットするまではメモリ上で処理しているんじゃないかな?
お礼
お返事遅くなり申し訳ありません。 回答ありがとうございます。 メモリ上というところは理解しているつもりなのですが、 コミットしても反映せず、ロールバックしてもテーブルロックがかかったままになり、 Accessを終了して再度起動するしか解除できなくなってしまいます。 とりあえずはロックタイプの指定を変えることで対処しましたが、 未だに動きが理解できてません・・・
- ShowMeHow
- ベストアンサー率28% (1424/5027)
adLockReadOnly でインサートできるわけないよね。
補足
ありがとうございます!結果としてご指摘の通り、 rst.Open strSql, cn, adOpenKeyset, adLockOptimistic でできました! が、府に落ちてません。。。 まず、adLockReadOnlyが読み取り専用(コピーのようなもの?)で開くということなので そのレコードセットに対する編集ができないのは分かるのですが コネクションのExecuteでも書き込みできないのでしょうか? そもそもExecute自体は通っていましたが、Execute直後からテーブルがロックされ コミットでも解放されないという現象が不可解に思います。 ちなみにトランザクションを使わない場合、インサートできていたのですが このプログラムの記述自体が何か不都合な書き方なのでしょうか? 可能性のレベルでも良いのでご指摘頂けますとありがたいです。
お礼
すみません。パスワードが分からなくなってしまいお返事遅れてしまいました。 回答ありがとうございます。 cneは登校時の間違いでした。