2012-04-13 8 views
0

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には渡されませんが、何らかの形で残っているレポートがガベージコレクションされ、ロックも解除されるというのは奇妙なことです。

+0

レポートのデータソースにどのようなロジックが影響していますか?任意のレコードセットを開いていますか?あなたのコードに含める必要があるCloseメソッドがありますか? NirSofts OpenedFilesViewを使用して、データベースを実際に開いているものを調べることができます。http://www.nirsoft.net/utils/opened_files_view.html – HK1

+0

@ HK1レポートには、システムDSNを使用してデータベース上で実行する独自のクエリがあります。 Report.Close、Report.Disposeなどのメソッドしかない場合は、そのメソッドは存在しません。 – Dabblernl

+0

おそらく間違った質問ですが、接続を閉じることができるようにレポートデータソースを制御することは可能でしょうか、それとも可能ですか? (私は無知で話す、私は決してCrystal Reportsを使用したことがない)。 – HK1

答えて

2

ガベージコレクションの問題ではない場合は、.NET/OLEDBプロバイダCRが使用している接続プーリングが考えられます。通常、JETデータベースでは有効になっていません。

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

+0

これはおそらく正しいアプローチですが、私はあまりにも面倒です。私は、データベースへの参照がそれに運ばれないように、Netに移植されたコードの一部を戻しました。 Crystal Reportsコード全体をVB6からNetに移行すると、何が起こるのかがわかります。 – Dabblernl

関連する問題