[リストへもどる]
一括表示

投稿時間:2002/08/21(Wed) 13:45
投稿者名:凍矢
Eメール:
URL :
タイトル:
印刷について
はじめまして、凍矢といいます。
色々HPを見て見たのですが、見つからなかったので質問させていただきます。

VB6(SP5)でAccess2000を使い帳票出力をしているのです。
最初はなにも帳票に出力できなかったのですが、MSに電話をして何とか帳票にデータが出力されるよ
うになり
ました。
ここまではいいのですが、ひとつ気になることがあって、その解決方法はないかと質問させていただ
きます。
VB6からACCESS2000のデータベースを使ってACCESS2000の帳票に出力するときに、データベースの同期
を取る
ために5秒時間稼ぎをしないといけないのです。
MSの解凍ではPCの処理速度が速すぎて印刷用テーブルに反映する前に帳票出力がされてしまうため、
白紙の帳
票が出来るとのことでした。

MSからの回答なので、上記の方法しかないのかも知れませんが、もし他に方法があれば教えていただ
きたいの
です。(PCを遅いのに換えればいいってのはなしですよ。)
どうかよろしくお願いします。

投稿時間:2002/11/19(Tue) 18:32
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Jetデータベースのキャッシュ動作
> VB6からACCESS2000のデータベースを使ってACCESS2000の帳票に出力するときに、
> データベースの同期を取るために5秒時間稼ぎをしないといけないのです。

5秒というのは、リードキャッシュの更新間隔ですね。レジストリの
  HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0\PageTimeout
によって設定される事になっています。(上記項目の初期設定値は 5000 です)

ただし厳密に言えば、それとは別にライトキャッシュの更新間隔分の待機も
必要だったりします。そのため、必ずしも5秒待てば良いというわけではありません。


> もし他に方法があれば教えていただきたいのです。

まずは、『ライトキャッシュ機構を使わず、直接mdbを更新する方法』から―――。

データの更新前後では、必ず、明示的にトランザクションを張るようにしてください。
これにより、Jetの自動遅延書き込み機構を使わない「同期書き込み」が行われるようになります。
なお、トランザクションの発行は、
  [DAO]
    WorkspaceオブジェクトのBeginTrans、CommitTrans、Rollback メソッド
  [ADO]
    ConnectionオブジェクトのBeginTrans、CommitTrans、RollbackTrans メソッド
で行います。

# ちなみに、トランザクションを張っていなかった場合は、「非同期書き込み」が利用されます。
# この場合、『ライトキャッシュがレジストリのMaxBufferSizeに指定されたサイズを超えた時』、
# もしくは、『最後の書込み動作以降に、レジストリのFlushTransactionTimeoutに設定された時間が
# 経過した時』に、メモリ上のキャッシュデータがmdbファイルに書き込まれるようになっています。


さて、上記により、Jetのライトキャッシュ機構を使わずに更新させる事ができますが、
さらにもう一点、OS自身のライトキャッシュ機構もバイパスさせる必要があります。

OS自身のライトキャッシュをフラッシュさせるには、
  [DAO]
    objWorkspace.CommitTrans dbForceOSFlush
  [ADO]
    Const JET_TCM_ASYNCFLUSH = 0
    Const JET_TCM_SYNCFLUSH = 1
    objConnection.Properties("Jet OLEDB:Transaction Commit Mode").Value = JET_TCM_SYNCFLUSH
というコードを実行すればOKです。
これらを行う事で、ライトキャッシュの待機が不要となります。


さて、ここからが本題。
『Jetのリードキャッシュを強制的にフラッシュさせる方法』です。


これは、レポートを開く前に、あらかじめ
  [DAO]
    DBEngine.Idle dbRefreshCache
  [ADO]
    CreateObject("JRO.JetEngine").RefreshCache objConnection

を行っておく事で回避できます。
上記のコードを実行すると、5秒間待機させたりせずとも、ディスク上から
強制的に、現在のキャッシュにデータを読み込ませる事ができます。

# ちなみに、JRO.JetEngineオブジェクトは、CreateObjectする以外にも、
# "Microsoft Jet and Replication Objects Library"を参照設定して
# 利用するということもできます。