Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


339 / 9994 ←次へ | 前へ→

【12968】Re:Docmd.RunSQLだと問題ないのにDatabase.Exeuteだと反映にタイムラグが出る
お礼  亀マスター  - 16/3/11(金) 0:23 -

引用なし
パスワード
   かるびの さん 回答ありがとうございます。

>>しかし、そうすると、Me.Requeryをしたにも拘わらず、更新前の
>>ままになってしまいます。また、別のフォームで、
>>Me.RequeryのところにDLookupを使っているものがあるのですが、
>>そちらでも、更新前のデータしか得られません。
>
> これらの事象は、非同期実行よる典型例だと思います。
> 事態が逆転してしまっていますね。実に妙なことだと思います。困惑するばかりです。

そうなんですよね。
非同期実行を防ぐ意味もあってDatabase.Executeを使っているのに、どうして…。

> トランザクション処理は、トランザクション中は、追加クエリなどの結果をメモリにとどめておき、
>CommitTrans により一気にファイルに書き込むものです。
> 全く根拠はありませんが、ここが非同期実行になっているのかもしれません。
> だとすると、トランザクションをやめることが、一つの対策となるかもしれません。

クエリの複数連続実行をしている部分があるので、エラーが起こった場合の
ロールバック処理をするために、トランザクションは使いたいところなんですよね…。

>>WSP.CommitTrans dbForceOSFlush
>>
>>DBEngine.Idle dbRefreshCache 
>
> dbForceOSFlush 定数とか、Idle メソッドとかがあるのは、全く知りませんでした。
> また、これらを使ったこともありません。
> なので、これらの効果や使用の是非については、私には何とも言えません。

上記の原因が、メモリ上の命令をデータベースファイルに反映するのが遅れていたり
読み取りにいった時にキャッシュから読んでしまっている可能性を考え、
OSのキャッシュを即座にデータベースファイルへ反映させるためのオプションと、
AccessのReadキャッシュを即座に最新のものにするためのもの(というつもり)です。
ただ、これを付けても付けなくても、結果は変わってないのですが…。

概ね5秒ほど待ってから読みにいくと正常にデータを拾えることから、
Me.RequeryやDLookupの段階でReadキャッシュを読んでしまっている可能性が
高いと思っているのですが(キャッシュの更新間隔がデフォルト設定だと
5秒程度らしいので)、だったらDBEngine.Idle dbRefreshCacheで解決するはず
なのに…。

トランザクションははずしたくないので、どうしてもダメならSleepで5秒待機を
させることにします。ユーザー側からしたら待ち時間が目に付くかもしれませんが、
データ不整合によるエラーを起こすよりはマシなので。

引き続き、参考になることがあればお願いします。
1,221 hits

【12965】Docmd.RunSQLだと問題ないのにDatabase.Exeuteだと反映にタイムラグが出る 亀マスター 16/3/9(水) 23:55 質問[未読]
【12967】Re:Docmd.RunSQLだと問題ないのにDatabase... かるびの 16/3/10(木) 10:47 回答[未読]
【12968】Re:Docmd.RunSQLだと問題ないのにDatabase... 亀マスター 16/3/11(金) 0:23 お礼[未読]
【12969】Re:Docmd.RunSQLだと問題ないのにDatabase... 亀マスター 16/3/14(月) 20:20 発言[未読]

339 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free