DataReader y el CommandBehavior Enumeration

El datareader sirve principalmente para recuperar datos y procesar ellos de forma rapida. Hay para todos los sabores (SqlDataReader, OleDbDataReader, OracleDataReader, OdbcDataReader) heredados de IDataReader. Es muy facil de usar pero hay que tener en cuenta que es un objecto que debe estar conectado para que funcione. Es decir el DataReader opera en una forma CONECTADA.Mientras que otros objectos como el DATASET y el DATATABLE si funcionan de una forma desconectada, con el DATAREADER no se puede hacer nada si no hay conection a una base.
Otra cosa a tener en cuenta es que con el DATAREADER la conexion debe de hacerse de forma manual (abrir la conexion Ej. ocon.Open()). Mientras que con el DATAADAPTER esto de abrir y cerrar es realizado de forma automatica.

Otro comportamiento del DATAREADER es que solo se pueda asociar a una conexion en un solo tiempo.
Hay que tener en cuenta que si se cierra la conexion tambien se cierra el Reader asociado, como dijimos el DATAREADER es inutil sin una conexion. Aunque es una buena practica explicitaqmente cerrar el reader ( asi otras personas pueden entender lo que se esta haciendo)


By Closing a connection, you'll close the reader because as I said, a DataReader is useless without a connection. However, it's good practice to explicitly close the reader (so other people can understand what's going one) and in instances like the one mentioned above, you need to leave the connection open for a few simultaneous operations, so you can't rely on closing the connection to close your reader.

El CommandBehavior.CloseConnection lo que hace es ue cierra la conexion asociada con el Reader cuando se cierra este. Asi si no especificamos el CommandBehavior, estamos usando el DEFAULT y la ConnectionState sera abierto cuando testamos este.Esto puede ser una caractteristica no importante pero a menudo olvidamos de cerrar la conexion y esto gasta recursos.
C#

SqlDataReader reader;
SqlCommand cmd = new SqlCommand("SELECT Facility FROM Tbl_Facilities", cn);
try
{
if(cn.State != ConnectionState.Open){cn.Open();}
}
catch(SqlException ex)
{
Debug.Assert(false, ex.ToString);
}
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(System.Exception ex)
{
Debug.Assert(false, ex.ToString());
}
while(reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
reader.Close;
Console.WriteLine(cn.State);//Closed
}

Fuente: http://www.knowdotnet.com/articles/schemas2.html

Un Saludo
Adalberto Montanía

Comentarios