2012-04-13 30 views
0

我們的VB6應用程序與代表不同結果集的多個MS-Access數據庫一起工作。當用戶選擇結果集時,包含結果集的數據庫在用戶需要其數據時重命名爲Temp.mdb。用戶完成後Temp.mdb被重命名爲其原始名稱。 (請接受這個設計,當時有一個很好的理由)。Crystal Report(XI RDP)堅持訪問數據庫

這種設計的一個缺陷是,當Temp.mdb打開連接時,重命名會失敗並顯示權限被拒絕的錯誤。所以在我們的代碼中,所有的連接都會事先關閉。

輸入Crystal報告: 我們使用CraxDRT.Application.OpenReport(路徑)創建報告,將它傳遞給一些Net dll's以設置其參數,然後將其發送到CRViewer或打印機。在此之後,報告似乎一直逗留並保持Temp.mdb的開放連接,從而寫保護temp.ldb。我試圖將Vb6和Net中的所有引用設置爲null/Nothing,但報告本身沒有IDispose接口,Close方法或其他。僅當關閉主應用程序時,與數據庫的連接纔會消失。重新啓動後,我可以重命名它。

必須有一種方法來釋放報告在Temp.ldb文件中保留的鎖,以便我可以重命名Temp.mdb。但是怎麼樣?

PS:奇怪的是,當我調用使用相同數據但不傳遞給Net dll的不同報表時,以某種方式或另一種方式傳回的報告會被垃圾收集,並且它也會釋放它的鎖。

+0

驅動報告數據源的邏輯是什麼?你打開任何記錄集?有什麼地方需要在代碼中包含Close方法嗎?您可以嘗試使用NirSofts OpenedFilesView來查看實際將數據庫打開的內容:http://www.nirsoft.net/utils/opened_files_view.html – HK1 2012-04-13 17:23:51

+0

@ HK1報告有自己的查詢,它使用系統DSN在數據庫上執行。如果只有Report.Close,Report.Dispose等方法,但沒有。 – Dabblernl 2012-04-13 17:32:09

+0

可能是一個愚蠢的問題,但是您可能或可行的控制報告數據源,以便關閉連接? (我用無知說話,我從未使用過Crystal Reports)。 – HK1 2012-04-13 17:33:52

回答

2

如果它不是垃圾收集問題,那麼它可能是通過.NET/OLEDB提供商CR使用的連接池。雖然通常不支持JET數據庫。

您可以將報告邏輯封裝在單獨的可執行文件中,該文件可啓動CR查看器或打印報告,然後有效地強制GC和/或清除打開的連接。

+0

這可能是正確的方法,但我覺得它太麻煩。我恢復了一些移植到Net的代碼,這樣就不會引用數據庫。當我們將整個Crystal Reports代碼從VB6遷移到Net時,我們將看到會發生什麼。 – Dabblernl 2012-05-01 09:03:53

相關問題