私たちの 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 に渡されず、何らかの方法で残留レポートがガベージ コレクションされ、ロックも解放されます。