2017-12-11 93 views
0

나는 엑셀 파일에 연결하는 기능이 있습니다는 OleDbConnection : 열고 함수를 사용하여 연결을 종료하는 방법

public OleDbConnection connection; 

    public void eConnection(string srcString, string id) 
    { 
     conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcString + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; 
     connection = new OleDbConnection(conString); 
     connection.Open(); 

    } 

내가 전화했을 때이 기존 연결을 닫거나

를 호출 다른 기능을 만들려을 나는 동일한 연결을 호출하는 기능을 사용하여 기존 연결을 닫을 수있는 방법

public void eCloseConnection() 
    { 
     connection.Close(); 
    } 

과 :

이 내가 시도하고 기존의 연결을 종료해야 할 것입니다 닫습니다.

연결이 닫혀 있는지 어떻게 테스트 할 수 있습니까?

+0

연결 문자열 이상을 보유하고 있다는 의미입니까? 코드는 하나의 연결 만 가지고 있으며 최신 연결 만 닫습니다. – jdweng

답변

1

이렇게하지 마십시오.

public void DoStuffWithExcel(string srcString) 
{ 
    conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcString + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; 
    using(var connection = new OleDbConnection(conString)) 
    { 
     connection.Open(); 
     // do your stuff here... 
    } 
} 

using 문은 보장 : OleDbConnectionIDisposable 인터페이스를 사용하여 즉시 작업이 완료로 배치되어야하고, 할 수있는 가장 좋은 방법은 그것이 using 문에서 선언 된 지역 변수로 사용하는 것입니다 구현 using 블록 내부에서 예외가 발생하더라도 올바르게 연결됩니다.
이 방법은 메모리 누수를 방지하고 연결 풀을 사용하는 가장 좋은 방법입니다. 마이크로 소프트의 문서 페이지 OLE DB, ODBC, and Oracle Connection Pooling에서

는 :

우리는 당신이 항상 가까이 권장하거나이 연결을 풀 (pool)로 반환하기 위해 그것을 사용이 끝나면 연결 폐기하십시오. 명시 적으로 닫히지 않은 연결은 풀로 반환되지 않을 수 있습니다. 예를 들어, 범위를 벗어 났지만 명시 적으로 닫히지 않은 연결은 최대 풀 크기에 도달하고 연결이 여전히 유효한 경우에만 연결 풀로 반환됩니다.

1

클래스 내부에 숨겨진 연결에 대한 전역 개체를 보관하지 마십시오. 이것은 해결 된 것보다 더 많은 문제를 추가합니다. 코드가 호출되는 시간과 생성되는 연결 수를 추적해야합니다. 그리고 물론 이것은 닫는 부분을 훨씬 더 복잡하게 만듭니다.

대신 C# 언어는 이러한 종류의 문제에 대해 더 나은 접근 방식을 제공합니다. 가능한 한 빨리 관리되지 않는 리소스를 OS에 재 출시해야하는 연결과 같은 개체에 특히 적합한 방법입니다. 당신이 당신의 연결을 처리하거나 클래스를 갖고 싶어 모두 당신은 대신이 방법을 사용한다

당신은 지금

public static class DbUtility 
{ 
    public static OleDbConnection eConnection(string srcString) 
    { 
     conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcString + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; 
     connection = new OleDbConnection(conString); 
     connection.Open(); 
     return connection; 
    } 
    .... other static utilities 
} 

이 방법

에서 클래스를 사용할 수 있습니다 열고 연결을 사용하려면
string srcFile = @"d:\temp\myFile.xlsx"; 
using(OleDbConnection cn = DbUtility.eConnection(srcFile)) 
{ 
    .. use your connection 

} // <- at this point your connection is automatically closed and disposed. 

using keyword은 연결과 같이 일회용 개체를 파괴해야하는 경우 큰 도움이됩니다. 이런 방식으로 전역 객체를 필요로하지 않을 때 주위에 보관하지 않아도됩니다.