2009-09-14 2 views
9

을 사용하여을 사용하여 내 DBCommand를 래핑하는 경우 다음 ado.net 코드가 있습니다. 아래 연결을 명시 적으로 닫아야합니까?dbCommand.Close()도 연결을 닫으시겠습니까?

감사합니다,

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

답변

4

예, 당신이 using 블록에 싸여 모든이 DbCommand 경우, 다음 것이다 현재 코드에서처럼 명시 적으로 DbConnection을 종료해야합니다. 그러나 Dispose으로 전화하면됩니다. CloseDispose을 모두 호출 할 필요는 없습니다. 그것은을 마친 후

+0

@Satya는이 경우 정확하며 답변이 실제로 잘못되었습니다. – Coops

+0

@CodeBlend : 누군가 Enterprise Library를 사용하고 있다면 그렇습니다. 그녀의 대답은 정확합니다. 그러나 코드가 '데이터베이스'와 같은 클래스를 참조하지만 질문의 내용과 태그는 EntLib을 참조하지 않습니다. 결과적으로 사람들이 묻는 질문에 대한 답을 찾고 있다면 여전히 정확합니다. –

-1

아니, 당신은하지 않습니다.

사용 블록의 끝 부분에 도달하면 dispose가 호출됩니다.

+2

나는 그것이 왜 명백히 잘못 되었기 때문에 이것이 왜 상향되고 있는지 전혀 모른다. 절대적으로 연결을 닫아야합니다. 이 질문은 ** 명령 **이 아닌 ** 연결 **을 처리해야한다는 것입니다. "명령"만을 사용하는 것은 그렇게하지 않습니다. –

+0

그의 코드에있는 주석과 dbCommand.Connection.Close 및 dbCommand.Connection.Dispose()를 명시 적으로 호출한다는 사실을 기반으로 저는 이미 명령을 사용하는 블록에 래핑 했으므로 필요한지 묻는 중이었습니다. 그는 여전히 db.Close와 db.Dispose와 같은 것을 호출해야하는지 묻는다면 당신은 100 % 맞습니다. 나는 그게 그의 질문이 무엇인지 생각하지 않았다. – cptScarlet

+0

"이미 내 DBCommand를 래핑하는 데 사용하는 경우 * 명시 적으로 * 연결을 닫아야합니다."분명히 말한 것 같습니다. –

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

는 응용 프로그램 블록은 데이터베이스 연결을 닫습니다. 예를 들어, ExecuteNonQuery 메소드의 구현에는 using 문이 포함됩니다. using 문은 리소스를 가져 와서 문을 실행하고 리소스를 삭제합니다. 이 경우 자원은 데이터베이스 연결입니다. ExecuteReader 메서드의 경우 응용 프로그램 블록은 Command-Behavior.CloseConnection 메서드를 사용하여 판독기를 닫은 후 연결을 닫습니다.

+0

여기서 '대답'으로 표시된 응답은 완전히 잘못 되었습니까? – Coops

1

이 게시물은 오래되었지만 EnterpriseLibrary와 함께이 블록을 사용하는 경우 연결이 닫혔다 고 대답하고 있습니다 (코드 블록의 클래스 및 메소드 이름을 보면이 점에 대해 생각하게됩니다). 질문을 한 사람과 EnterbriseLibrary에 대해 이야기하고 있는지 여부를 명시 적으로 고려해야하는 사람. finally 블록을 사용하여 테스트 한 결과 YES 인 경우 DbCommand를 사용하여 using 블록을 사용하면 연결이 자동으로 닫힙니다.

+0

코드를 게시 할 수 있습니까? 제가 생각하기는하지만 여러분이 말하는 내용이 정확하다는 것을 증명할 수있는 예제가 필요합니다. – Coops

관련 문제