我們的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的不同報表時,以某種方式或另一種方式傳回的報告會被垃圾收集,並且它也會釋放它的鎖。
驅動報告數據源的邏輯是什麼?你打開任何記錄集?有什麼地方需要在代碼中包含Close方法嗎?您可以嘗試使用NirSofts OpenedFilesView來查看實際將數據庫打開的內容:http://www.nirsoft.net/utils/opened_files_view.html – HK1 2012-04-13 17:23:51
@ HK1報告有自己的查詢,它使用系統DSN在數據庫上執行。如果只有Report.Close,Report.Dispose等方法,但沒有。 – Dabblernl 2012-04-13 17:32:09
可能是一個愚蠢的問題,但是您可能或可行的控制報告數據源,以便關閉連接? (我用無知說話,我從未使用過Crystal Reports)。 – HK1 2012-04-13 17:33:52