无法努力关闭在内存中运行的excel进程

时间:2010-04-21 17:30:18

标签: vb.net excel-vba excel-2007 vba excel

我开发了一个VB.Net代码,用于从excel文件中检索数据。我以一种形式加载这些数据,并在对数据进行必要的修改后将其更新回excel。这个完整的流程工作正常,但我观察到的大部分时间,即使我关闭表格;已加载的excel进程无法正常关闭。

我尝试了所有可能的方法来关闭它,但无法解决问题。查找以下用于连接到Excel的代码,如果我可能需要遵循其他方法来解决此问题,请告诉我。

注意:我不想杀死excel进程,因为它会杀死excel的其他实例

Dim connectionString As String

connectionString =“Provider = Microsoft.Jet.OLEDB.4.0; Data Source =”& ExcelFilePath& “;  扩展属性= excel 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

1 个答案:

答案 0 :(得分:0)

您正在使用旧的VB6 COM接口。你的代码片段中没有任何证据可以在RecordSet上调用Close()。您无法在Connection上调用Close(),因为您将其设置为Nothing。

如上所述,在垃圾收集器运行并且终结器线程在COM接口上释放引用计数之前,Excel不会退出。如果您的程序在处理数据后没有退出或处于休眠状态,则可能需要很长时间。你真的应该考虑提升这个代码来使用System.Data.Oledb中的类,这样你就可以在完成对象时正确地Dispose()所有内容。

Q& D解决方案是强制终结器线程运行:

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

使用RecordSet完成后运行此命令。不建议这样做。