2010-04-21 52 views
0

我開發了一個VB.Net代碼,用於從excel文件中檢索數據。我將這些數據加載到一個表單中,並在對數據進行必要的修改後將其更新到Excel中。這種完整的流程正常,但我觀察到的大多數時候,即使我關閉表格;已加載的excel進程沒有正確關閉。無法認真關閉在內存中運行的excel進程

我嘗試了所有可能的方法來關閉它,但無法解決問題。查找下面我用來連接到excel的代碼,並讓我知道是否有其他方法可能需要解決此問題。

注:我不想殺死Excel的過程,因爲它會殺了Excel

昏暗的connectionString的其他實例作爲字符串

的connectionString =「供應商= Microsoft.Jet.OLEDB.4.0;數據來源=」 & ExcelFilePath & 「; 擴展屬性=練成8.0;堅持安全信息=假」

excelSheetConnection = New ADODB.Connection 

    If excelSheetConnection.State = 1 Then excelSheetConnection.Close() 
    excelSheetConnection.Open(connectionString) 
    objRsExcelSheet = New ADODB.Recordset 

    If objRsExcelSheet.State = 1 Then objRsExcelSheet.Close() 
    Try 
     If TestID = "" Then 
      objRsExcelSheet.Open("Select * from [" & ActiveSheet & "$]", excelSheetConnection, 1, 1) 
     Else 
      objRsExcelSheet.Open("Select Test_ID,Test_Description,Expected_Result,Type,UI_Element,Action,Data,Risk from [" & ActiveSheet & "$] WHERE TEST_Id LIKE '" & TestID & ".%'", excelSheetConnection, 1, 1) 
     End If 
     getExcelData = objRsExcelSheet 
    Catch errObj As System.Runtime.InteropServices.COMException 
     MsgBox(errObj.Message, , errObj.Source) 
     Return Nothing 
    End Try 

    excelSheetConnection = Nothing 
    objRsExcelSheet = Nothing 

回答

0

您正在使用舊VB6 COM接口。在您的代碼片段中沒有任何證據表明您曾經在RecordSet上調用過Close()。因爲您將它設置爲Nothing,所以無法在Connection上調用Close()。

正如所寫,在垃圾收集器運行並且終結器線程釋放COM接口上的引用計數之前,Excel不會退出。如果您的程序在處理完數據後沒有退出或進入休眠狀態,則可能需要很長時間。您真的應該考慮提升此代碼以使用System.Data.Oledb中的類,以便您可以在完成對象時正確Dispose()所有內容。

將q & d的解決辦法是迫使終結的線程來運行:您所使用的記錄集完成此操作後

GC.Collect() 
    GC.WaitForPendingFinalizers() 
    GC.Collect() 

運行。這是不建議的。

相關問題