みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2014-12-11 15:39:28

QNo.8854755

困ってます

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

確認ですが、
トランザクションを掛けているConnectionはcn
インサートを行っているConnectionはcneになっていますが
これは投稿時の間違いですか?

投稿日時 - 2014-12-11 21:28:36

お礼

すみません。パスワードが分からなくなってしまいお返事遅れてしまいました。

回答ありがとうございます。
cneは登校時の間違いでした。

投稿日時 - 2015-01-06 16:25:48

ANo.2

シロウトなので、詳しいことは知らないので憶測だけど
コミットするまではメモリ上で処理しているんじゃないかな?

投稿日時 - 2014-12-11 19:17:42

お礼

お返事遅くなり申し訳ありません。
回答ありがとうございます。

メモリ上というところは理解しているつもりなのですが、
コミットしても反映せず、ロールバックしてもテーブルロックがかかったままになり、
Accessを終了して再度起動するしか解除できなくなってしまいます。

とりあえずはロックタイプの指定を変えることで対処しましたが、
未だに動きが理解できてません・・・

投稿日時 - 2015-01-06 16:32:14

ANo.1

adLockReadOnly
でインサートできるわけないよね。

投稿日時 - 2014-12-11 15:47:15

補足

ありがとうございます!結果としてご指摘の通り、
rst.Open strSql, cn, adOpenKeyset, adLockOptimistic
でできました!
が、府に落ちてません。。。

まず、adLockReadOnlyが読み取り専用(コピーのようなもの?)で開くということなので
そのレコードセットに対する編集ができないのは分かるのですが
コネクションのExecuteでも書き込みできないのでしょうか?

そもそもExecute自体は通っていましたが、Execute直後からテーブルがロックされ
コミットでも解放されないという現象が不可解に思います。

ちなみにトランザクションを使わない場合、インサートできていたのですが
このプログラムの記述自体が何か不都合な書き方なのでしょうか?

可能性のレベルでも良いのでご指摘頂けますとありがたいです。

投稿日時 - 2014-12-11 16:40:08

あなたにオススメの質問