2013-02-07 29 views
17

निम्नलिखित में से दो उदाहरण सही हैं? (या जो एक बेहतर है और मैं का उपयोग करना चाहिए)क्या मुझे "उपयोग" कथन के अंदर 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])); 
       } 
      } 
     } 
    } 
} 

तो , सवाल यह है: क्या मुझे using कथन का उपयोग SqlCommand और SqlDataReader में भी करना चाहिए या SqlConnectionusing कोड ब्लॉक के अंत में स्वचालित रूप से उनका निपटारा किया जाना चाहिए।

+2

संभावित डुप्लिकेट [क्या एसक्यूएलटाटाइडर मैन्युअल रूप से बंद करना और निपटाना आवश्यक है?] (Http://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of- sqldatareader) –

+0

यह भी संबंधित है: [DataReader के आस-पास "उपयोग" कथन डालने से इसे बंद कर दिया जाएगा?] (http://stackoverflow.com/q/2157276/456814)। –

उत्तर

29

दूसरा विकल्प का अर्थ है कि आपके reader इसे बनाए जाने के बाद अपवाद की स्थिति में बंद कर दिया जाएगा, इसलिए इसे प्राथमिकता दी जाती है।

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

अधिक जानकारी के लिए MSDN देखें:

इसे प्रभावी ढंग से करने के लिए संकलक द्वारा तब्दील हो जाता है।

8

आप वास्तव में usings, एक साथ सूचीबद्ध कर सकते हैं एक ला:

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])); 
      } 
     } 
    } 

इसे पाठक का निपटान करना चाहिए, और उपयोग समाप्त होने पर निहित कनेक्शन और कमांड का निपटान करना चाहिए।

या क्या मुझे कुछ याद आया है?