query net ejemplo c# .net ado.net sqlconnection

c# - net - ¿Debo usar SqlDataReader dentro de una declaración de "usar"?



sqlconnection query (3)

¿Cuál de los dos ejemplos siguientes es correcto? (O cual es mejor y debo usar)

En la MSDN encontré esto:

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

Sin embargo, mirando otras páginas, algunos usuarios sugieren hacerlo de esta manera:

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

Entonces, la pregunta es: ¿debo usar la instrucción using también en SqlCommand y en SqlDataReader o se eliminan automáticamente al final de SqlConnection using bloque de código?


¿No sería más sencillo utilizar este código?

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

Esto debería deshacerse del lector, y la conexión y el comando implícitos cuando se termina el uso.

¿O me he perdido algo?


La segunda opción significa que su reader se cerrará en el caso de una excepción después de que se haya creado, por lo que se prefiere.

Es efectivamente transformado por el compilador para:

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

Ver MSDN para más información.


Puedes enumerar los usos juntos, a la:

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