2013-08-21 2 views
3

SQL 쿼리를 매개 변수로 받아들이고 DataReader를 반환하는 도우미 메서드를 만들려고합니다. 나는 (시간 초과 연결 풀에 관련된 문제가 모든 클라이언트 호출에 사용하는 문장에도 불구하고쿼리 문자열에서 DataReader를 만드는 C#의 도우미 메서드를 작성하는 방법?

public List<FileGroupDetail> LoadGroupDetail() 
{ 
    String query = ...; 

    using (IDataReader reader = GetReader(query)) 
    { 
     return reader.Select(...); 
    } 
} 

:

private IDataReader GetReader(String query) 
{ 
    try 
    { 
     var connection = dbProvider.CreateConnection(); 
     var command = dbProvider.CreateCommand(); 
     command.CommandText = query; 
     command.Connection = connection; 
     command.Connection.Open(); 
     return command.ExecuteReader(); 
    } 
    catch (Exception ex) 
    { 
     ... 
    } 
} 

클라이언트 코드는 다음과 같습니다

나는 그런 일을 썼다 전송 수준 오류 등)

다음 단계는 연결을 매개 변수로 허용하는 GetReader의 오버로드를 추가하는 것입니다. 그것은 좋은 습관입니까 아니면 더 좋은 패턴입니까?

+0

전송 및 시간 초과 오류가이 코드로 인해 발생했다고 생각하지 않습니다. – Dennisch

답변

2

현재 연결이 닫히지 않고 있습니다. (CommandBehavior.CloseConnection, ExecuteReader에게 전달 된) 연결을 독자에게 말하면 문제를 해결할 수 있지만 풀 채도 만 처리합니다. 실제 문제가 차선/과도한 쿼리 인 경우 많은 작업을 수행 할 수 없습니다. 이 디자인은 사람들이

합격 최적이 아닐 수 ... 독자와 함께 작동 할 것으로 예상 파라미터를

  • 이 디자인을 허용하지 않습니다

    • : 나는, 그러나, 매우 걱정 것 연결에서 호출자의 연결의 소유권을 유지하면 이 더 깨끗하고 명확하게이 될 것입니다.하지만 그렇게 해보면 "까다로운"도구를 살펴볼 필요가 있습니다.이 도구는 많은 문제를 매우 해결합니다. 우아하게 예를 들어 :

      string region = "North"; 
      using(var conn = dbProvider.CreateConnection()) { 
          return conn.Query<Custom>(
           "select * from Customers where [email protected]", 
           new { region } // full parameterization, the easy way 
          ).ToList(); // Query<T> returns IEnumerable<T>, ideal for LINQ-to-Objects 
      } 
      
  • 관련 문제