VB6アプリケーションは、異なる結果セットを表す複数のMS-Accessデータベースで動作します。ユーザーが結果セットを選択すると、結果セットを含むデータベースの名前がTemp.mdbに変更され、ユーザーがそのデータを必要とします。ユーザーが完了すると、Temp.mdbは元の名前に変更されます。 (このデザインを受け入れてください、それは当時の理由がありました)。Crystal Report(XI RDP)がAccessデータベースを保持しています
このデザインの落とし穴は、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には渡されませんが、何らかの形で残っているレポートがガベージコレクションされ、ロックも解除されるというのは奇妙なことです。
レポートのデータソースにどのようなロジックが影響していますか?任意のレコードセットを開いていますか?あなたのコードに含める必要があるCloseメソッドがありますか? NirSofts OpenedFilesViewを使用して、データベースを実際に開いているものを調べることができます。http://www.nirsoft.net/utils/opened_files_view.html – HK1
@ HK1レポートには、システムDSNを使用してデータベース上で実行する独自のクエリがあります。 Report.Close、Report.Disposeなどのメソッドしかない場合は、そのメソッドは存在しません。 – Dabblernl
おそらく間違った質問ですが、接続を閉じることができるようにレポートデータソースを制御することは可能でしょうか、それとも可能ですか? (私は無知で話す、私は決してCrystal Reportsを使用したことがない)。 – HK1