我开发了一个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
答案 0 :(得分:0)
您正在使用旧的VB6 COM接口。你的代码片段中没有任何证据可以在RecordSet上调用Close()。您无法在Connection上调用Close(),因为您将其设置为Nothing。
如上所述,在垃圾收集器运行并且终结器线程在COM接口上释放引用计数之前,Excel不会退出。如果您的程序在处理数据后没有退出或处于休眠状态,则可能需要很长时间。你真的应该考虑提升这个代码来使用System.Data.Oledb中的类,这样你就可以在完成对象时正确地Dispose()所有内容。
Q& D解决方案是强制终结器线程运行:
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
使用RecordSet完成后运行此命令。不建议这样做。