2010-04-21 2 views
0

엑셀 파일에서 데이터를 검색하기위한 VB.Net 코드를 개발했습니다.이 데이터를 한 가지 형식으로로드하고 필요한 수정을 한 후에 Excel에서 다시 업데이트합니다. 이 완벽한 흐름은 정상적으로 작동하지만 대부분의 경우 나는 폼을 닫더라도 그것을 지켜 보았습니다. 이미로드 된 엑셀 프로세스가 제대로 닫히지 않습니다.메모리에서 실행중인 엑셀 프로세스를 열심히 닫을 수 없습니다.

가능한 모든 방법을 사용하여 닫았지만 문제를 해결할 수 없었습니다. 연결에 사용하고있는 코드를 아래에서 찾아서이 문제를 해결하기 위해 다른 방법이 필요할 경우 알려주십시오.

참고 : 나는 그것이 문자열

를 ConnectionString = "공급자 = Microsoft.Jet.OLEDB.4.0으로 엑셀

희미한를 ConnectionString의 다른 인스턴스를 죽일 것 같은 엑셀 프로세스를 죽이고 싶어하지 않는다 데이터 출처 = "& 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()를 호출 할 수 없습니다.

작성된 것처럼 Excel은 가비지 수집기가 실행되고 종료 기 스레드가 COM 인터페이스에서 참조 카운트를 해제 할 때까지 종료되지 않습니다. 데이터를 처리 한 후 프로그램이 종료되거나 휴면 모드로 전환되지 않는 경우 오랜 시간이 걸릴 수 있습니다. System.Data.Oledb의 클래스를 사용하려면이 코드를 향상시켜야합니다. 그러면 개체를 다 처리 할 때 모든 것을 적절하게 Dispose() 할 수 있습니다.

하기 Q & D 솔루션은 실행 종료 자 스레드를 강제하는 것입니다 : 당신이 레코드 집합을 사용하여 수행하고

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

실행이 후. 다른 방법으로 권장하지 않습니다.

관련 문제