2010-03-18 2 views
1

DbConnection 및 DbCommand를 이해하고 이러한 개체를 사용 후 적절한 방법으로 처리하려고합니다.C# + DbConnection 및 DbCommand 처분 및 catch 오류

다음 코드는 제가 가지고있는 코드입니다. DbConnection 및 DbCommand에서 "using 문 사용"으로 충분합니까? 가능한 메모리 누수를 방지하려고합니다.

두번째 질문,

내가 DbCommand 개체를 폐기해야합니까?

감사 using를 사용하여 많은

DbProviderFactory fac = DbProviderFactories.GetFactory(this.DatabaseProviderName); 

using (DbConnection dbConn = fac.CreateConnection()) 
{ 
    dbConn.ConnectionString = this.ConnectionString; 

    using (DbCommand comm = fac.CreateCommand()) 
    { 
      comm.CommandText = "select * from aTable"; 
      comm.Connection = dbConn; 
      DataTable targetTable = new DataTable(); 

      DbDataAdapter facDA = fac.CreateDataAdapter(); 
      facDA.SelectCommand = comm; 
      facDA.Fill(targetTable); 

      //assuming Adapter would open/close connection (right assumption?) 

      //do something with the datatable 
    } 
} 

답변

5

finally에서 호출 dispose()try/finally 블록과 동일합니다.

DbCommandusing 문으로 표시되어야하며 IDisposable을 구현해야합니다. DbCommand 당신이 중 하나를

  • 이 (IDbCommand)
  • 사용 등 SqlCommand 같은 미리 정의 된 파생 클래스 중 하나의 인터페이스로는
  • 코드에서 파생해야합니다, 그래서 추상 클래스가 실제로는 것을

    주 . 나도 이것에 대한 DbCommand에 대한 위의 제안으로 비슷한 일을 할 필요가있을 것이다, 그래서

DbConnection 또한 추상 클래스입니다.

일반적인 권장 사항은 객체가 IDisposable 구현하는 경우,이 Dispose()이 예외가 문 블록 내에서 발생 된 경우에도 리소스를 호출되도록 using 문에 싸여해야한다는 것입니다. 귀하의 예제에서, 각 연결, 명령, DataTableDbDataAdapter 개체를 using 문으로 래핑하는 것이 좋습니다.

1

예 DbCommand 개체에서 Dispose를 호출합니다. 일반적으로 규칙은 IDisposable을 구현하는 경우 적절할 때 Dispose 메서드를 호출해야합니다. 귀하의 코드는 잘 형성되어 있습니다. 나는 네가 제대로 된 것 같아.

EDIT 실제로 DbDataAdapter는 IDisposable을 구현하기 때문에 using 문에 포장 할 수도 있습니다.

1

당신이하는 것처럼 블록을 using 블록으로 감싸고 있으면 충분합니다. 예외가 발생하더라도 코드 호출은 Dispose이됩니다.

그렇습니다. DbCommand 개체는 물론 DbDataAdapterDataTable 개체에 해당 작업을 수행해야합니다. 그들은 모두 (직접 또는 간접적으로) IDisposable을 구현합니다.