문제

DBConnection과 DBCommand를 이해하려고 노력하고 있으며 사용 후 해당 객체를 처리하는 적절한 방법을 이해하려고합니다.

다음은 내가 가지고있는 코드 스 니펫입니다. DBConnection 및 DBCommand에서 "사용 명령문"을 사용하면 충분합니까? 메모리 누출을 방지하려고합니다.

두 번째 질문,

dbcommand 객체를 처리해야합니까?

정말 감사합니다

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
     }
}
도움이 되었습니까?

해결책

사용 using a와 동일합니다 try/finally 블록 dispose() 호출 finally.

DbCommand a using 그것을 구현하는 진술 IDisposable.

주목하십시오 DbCommand 실제로 추상적 인 클래스이므로 어느 쪽이든

  • 그것으로부터 파생
  • 인터페이스에 코드 (IDbCommand)
  • 사전 정의 된 파생 클래스 중 하나를 사용하십시오 SqlCommand.

DbConnection 또한 추상 수업이므로 위에서 제안한 것과 비슷한 일을해야합니다. DbCommand 이것도.

일반적인 권장 사항은 객체가 구현되는 경우입니다 IDisposable, 그것은 a using 그런 진술 Dispose() 명세서 블록 내에서 예외가 발생하더라도 자유 리소스로 호출됩니다. 예에서 좋은 관행은 각 연결, 명령을 마무리하는 것입니다. DataTable 그리고 DbDataAdapter a using 성명.

다른 팁

예, DBCOMMAND 개체에 대한 처분이라고합니다. 일반적으로 규칙은 idisposable을 구현하면 적절한 경우 처분 방법을 호출해야한다는 규칙입니다. 당신의 코드는 나에게 잘 형성됩니다. 나는 당신이 올바른 길을 가고 있다고 생각합니다.

편집하다 실제로, 당신은 dbdataadapter를 사용 명령문으로 랩핑 할 수도 있습니다.

물체를 감싸십시오 using 당신이하는 블록은 충분해야합니다. 코드가 호출됩니다 Dispose 예외가 발생하더라도.

그리고 네, 당신은 그렇게해야합니다 DbCommand 물체뿐만 아니라 DbDataAdapter 그리고 DataTable. 그들은 모두 (직간접 적으로) 구현합니다 IDisposable.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top