C# + DBConnection 및 DBCommand 처분 및 캐치 오류
-
21-09-2019 - |
문제
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
.