2013-02-07 1 views
17

다음 중 올바른 두 가지 예는 무엇입니까? 나는이 발견"using"문에서 SqlDataReader를 사용해야합니까?

은 MSDN에서 (또는 어느 쪽이 더 나은 내가 사용해야합니다) :

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;" 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection); 
     connection.Open(); 

     SqlDataReader reader = command.ExecuteReader(); 

     // Call Read before accessing data. 
     while (reader.Read()) 
     { 
      Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1])); 
     } 

     // Call Close when done reading. 
     reader.Close(); 
    } 
} 

그러나 일부 사용자는이 방법을 수행하는 것이 좋습니다 다른 페이지 찾고 : 그래서

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;"; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     using (SqlCommand command = new SqlCommand(queryString, connection)) 
     { 
      connection.Open(); 

      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       // Call Read before accessing data. 
       while (reader.Read()) 
       { 
        Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1])); 
       } 
      } 
     } 
    } 
} 

을 질문은 : SqlCommandSqlDataReader에도 using 문을 사용해야합니까, 아니면 코드 블록 SqlConnectionusing 코드 블록 끝에 자동으로 처리해야합니까?

+2

가능한 [SqlDataReader를 수동으로 닫고 처리해야합니까?] (http://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of- –

+0

관련 항목 : [DataReader를 닫을 때 "using"문을 닫으면 닫습니까?] (http://stackoverflow.com/q/2157276/456814). –

답변

29

두 번째 옵션은 생성 후 예외 발생시 닫히는 것을 의미하므로 바람직합니다.

SqlDataReader reader = command.ExecuteReader(); 
try 
{ 
    .... 
} 
finally 
{ 
    if (reader != null) 
     ((IDisposable)reader).Dispose(); 
} 

더 많은 정보를 원하시면 MSDN를 참조하십시오

그것은 효과적으로에 컴파일러에 의해 변환된다.

8

실제로, 함께 라 using이를 나열 할 수 있습니다

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = 
     "SELECT OrderID, CustomerID FROM dbo.Orders;"; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlCommand command = new SqlCommand(queryString, connection)) 
    { 
     connection.Open(); 

     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      // Call Read before accessing data. 
      while (reader.Read()) 
      { 
       Console.WriteLine(String.Format("{0}, {1}", 
       reader[0], reader[1])); 
      } 
     } 
    } 
} 
1

가이 코드를 사용하는 것이 더 간단하지 않을까요?

private static void ReadOrderData(string connectionString) 
    { 
     string queryString = 
      "SELECT OrderID, CustomerID FROM dbo.Orders;"; 

     using (SqlDataReader reader = SqlHelper.ExecuteReader(connectionString, CommandType.Text, queryString)) 
     { 
      // Call Read before accessing data. 
      while (reader.Read()) 
      { 
       Console.WriteLine(String.Format("{0}, {1}", 
       reader[0], reader[1])); 
      } 
     } 
    } 

독자의 사용을 중단하고 사용이 종료 될 때 암시 적 연결 및 명령을 처리해야합니다.

내가 놓친 것이 있습니까?