|
>実は元々DoCmd.RunSQLを使っており、その際は問題なかったのですが、
>複数のSQLを連続して使う際にあまりよくないと聞いたもので、
>Database.Executeを使うパターンに切り替えたのです。
同期・非同期の問題ですね。
RunSQL メソッドは非同期実行、Execute メソッドは同期実行と言われています。
非同期実行というのは、例えば、RunSQL メソッドで追加クエリを実行した場合、
追加クエリが完了しないうちに、VBAにおける次行のコードが実行されてしまうものです。
このため、次行実行時には、まだレコードが追加されていないということが起こり得ます。
そうなると、あると思っていたレコードがテーブルにはないということになってしまうので、
思っていた結果にならないということになってしまいます。
これに対し、同期実行であれは、追加クエリが完了しないうちは、
VBAにおける次行のコードが実行されません。
そのため、上記のような問題は生じません。
こうしたことから、追加クエリの実行は、Execute メソッドを使った方がいいと言われています。
>しかし、そうすると、Me.Requeryをしたにも拘わらず、更新前の
>ままになってしまいます。また、別のフォームで、
>Me.RequeryのところにDLookupを使っているものがあるのですが、
>そちらでも、更新前のデータしか得られません。
これらの事象は、非同期実行よる典型例だと思います。
事態が逆転してしまっていますね。実に妙なことだと思います。困惑するばかりです。
その原因はわかりません。
ただ、強いて言えば、トランザクション処理にあるのかなと思います。
トランザクション処理は、トランザクション中は、追加クエリなどの結果をメモリにとどめておき、
CommitTrans により一気にファイルに書き込むものです。
全く根拠はありませんが、ここが非同期実行になっているのかもしれません。
だとすると、トランザクションをやめることが、一つの対策となるかもしれません。
>WSP.CommitTrans dbForceOSFlush
>
>DBEngine.Idle dbRefreshCache
dbForceOSFlush 定数とか、Idle メソッドとかがあるのは、全く知りませんでした。
また、これらを使ったこともありません。
なので、これらの効果や使用の是非については、私には何とも言えません。
|
|