0

私たちの VB6 アプリケーションは、異なる結果セットを表す複数の MS-Access データベースで動作します。ユーザーが結果セットを選択すると、その結果セットを含むデータベースの名前が、ユーザーがデータを必要とするまで Temp.mdb に変更されます。ユーザーが完了すると、Temp.mdb の名前が元の名前に変更されます。(このデザインを受け入れてください。当時は正当な理由がありました)。

この設計の落とし穴は、Temp.mdb への開いている接続がある場合、名前の変更が許可拒否エラーで失敗することです。したがって、私たちのコードでは、すべての接続が細心の注意を払って事前に閉じられています。

Crystal レポートを入力します。CraxDRT.Application.OpenReport(path) を使用してレポートを作成し、それをいくつかの Net dll に渡してパラメータを設定し、CRViewer またはプリンタに送信します。この後、レポートが残り続け、Temp.mdb への接続を開いたままにし、temp.ldb を書き込み保護しているようです。Vb6 および Net 内のレポートへのすべての参照を null/Nothing に設定しようとしましたが、レポート自体には IDispose インターフェイス、Close メソッドなどはありません。メイン アプリケーションを閉じたときにのみ、データベースへの接続が失われます。再起動後、名前を変更できます。

Temp.mdb の名前を変更できるように、Temp.ldb ファイルに対してレポートが保持しているロックを解除する方法が必要です。しかし、どのように??

PS: 奇妙なことに、同じデータを使用する別のレポートを呼び出すと、それが Net dll に渡されず、何らかの方法で残留レポートがガベージ コレクションされ、ロックも解放されます。

4

1 に答える 1

2

ガベージ コレクションの問題でない場合は、CR が使用している .NET/OLEDB プロバイダーによる接続プールである可能性があります。ただし、通常、JET データベースでは有効になっていません。

レポート ロジックを別の実行可能ファイルにラップして、CR ビューアーを起動するか、レポートを出力してから、効果的に GC を強制的に終了したり、開いている接続をクリアしたりできます。

于 2012-04-13T18:26:11.247 に答える