Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Docente: M.A. Alex Pacheco Moya ACCESO CONECTADO CONTENIDO DATAREADER • ¿Qué es un DataReader? • Crear un DataReader • Leer un DataReader S2 ACCESO CONECTADO ¿Qué es un DataReader? Introducción Sólo hacia delante, sólo lectura Acceso rápido a datos Conexión a la fuente de datos Cuando se recupera una gran cantidad de datos de una fuente de datos, mantener la memoria abierta puede ser un problema. Por ejemplo, leer 10.000 filas de una base de datos hace que un objeto DataTable asigne y mantenga memoria para esas 10.000 filas durante la vida de la tabla. Si 1.000 usuarios hacen esto contra el mismo equipo a la vez, el uso de la memoria será un factor crítico. Para abordar estas situaciones del uso de memoria, la clase DataReader está diseñada para producir un flujo de datos de sólo lectura y sólo hacia delante que la base de datos devuelve. Por tanto, sólo hay un registro en memoria cada vez en el servidor. La clase DataReader proporciona una transferencia de datos de sólo lectura y sólo hacia delante que puede vincularse a un control enlazado a lista. Por ejemplo, si sólo deseamos mostrar los resultados de una consulta a una base de datos en un único control enlazado a lista, y si no vamos a manipular esos datos, una clase DataReader es una forma ideal de conseguirlo. Los objetos DataReader son más rápidos que los objetos DataSet por la naturaleza ligera de la clase DataReader. En la creación del objeto DataSet, la sobrecarga es mayor debido a que los objetos DataSet tienen la capacidad de leer y escribir datos y examinar hacia delante y hacia atrás. Hay muy poca sobrecarga en un objeto DataReader ya que es sólo hacia delante y sólo de lectura. Esta relativa falta de sobrecarga supone un acceso a datos más rápido con un objeto DataReader que con un objeto DataSet. ADO.NET incluye dos tipos de objetos DataReader: el objeto SqlDataReader para datos SQL Server versión 7.0 o posterior, y el objeto OleDbDataReader para datos OLE DB Data Provider. Utilizamos los objetos OleDbCommand y SqlCommand, y el método ExecuteReader, para transferir datos a un objeto DataReader. Gestión de la conexión por sí mismo Gestión de los datos uno mismo Utiliza menos recursos del servidor A diferencia de un objeto DataAdapter que se abre y cierra automáticamente, debemos gestionar la conexión del objeto DataReader por nosotros mismos. La clase DataReader se parece a la clase DataAdapter en que creamos un objeto Command desde una instrucción y una conexión SQL. Sin embargo, con el objeto DataReader Command, debemos abrir y cerrar explícitamente el objeto Connection. Tenemos la opción de recorrer los datos del objeto DataReader y mostrarlo programáticamente, o podemos vincular un objeto DataReader a un control enlazado a lista. En ambos casos, debemos escribir el código nosotros mismos. Debido a que el DataReader no es una representación en memoria de los datos, utilizar un DataReader afecta poco a la disponibilidad de los recursos del servidor. Crear un DataReader Introducción Utilizar un DataReader Para utilizar un objeto SqlDataReader, necesitamos crear un objeto SqlCommand en lugar de un objeto SqlDataAdapter, que es lo que se necesitaba con los objetos DataSet. El objeto SqlCommand expone un método ExecuteReader que devuelve un objeto SqlDataReader. Similar a un objeto DataAdapter, creamos un objeto Command desde una instrucción SQL y una conexión. Sin embargo, con el objeto DataReader Command, debemos explícitamente abrir y cerrar el objeto Connection. Para utilizar un objeto DataReader, debemos codificar manualmente todo el proceso de conexión. Para utilizar un objeto DataReader se requieren los siguientes pasos: 1. Crear y abrir la conexión a la base de datos. 2. Crear un objeto Command. 3. Crear el objeto DataReader desde el objeto Command. 4. Invocar el método ExecuteReader. 5. Utilizar el objeto DataReader. 6. Cerrar el objeto DataReader. 7. Cerrar el objeto Connection. Visual Basic .NET El siguiente código de ejemplo abre una conexión a una base de datos, crea un objeto DataReader desde un objeto Command, y recorre el objeto DataReader y agrega campos de los registros a un control ListBox: 'Create connection and command objects Dim conn As New SqlConnection _ ("data source=localhost;integrated security=true;" & _ "initial catalog=pubs") Dim cmdAuthors As New SqlCommand _ ("select from Authors", conn) conn.Open() 'create DataReader and display data Dim dr As SqlDataReader dr = cmdAuthors.ExecuteReader() Do While dr.Read() lstBuiltNames.Items.Add(dr("au_lname") + ", " + _ dr("au_fname")) Loop 'close DataReader and Connection dr.Close() conn.Close() C# // Open Connection and create command SqlConnection conn = new SqlConnection ("data source=localhost; integrated security=true; " + "initial catalog=pubs;"); SqlCommand cmdAuthors = new SqlCommand ("select from Authors", conn); conn.Open(); // Create DataReader and read data SqlDataReader dr; dr = cmdAuthors.ExecuteReader(); while (dr.Read()) { lstBuiltNames.Items.Add(dr["au_lname"] + ", " + dr["au_fname"]); } // Close DataReader and Connection dr.Close(); conn.Close(); Utilizar el controlador de eventos Try…Catch…Finally Visual Basic .NET C# Cuando se utilizan conexiones con el objeto DataReader, debemos utilizar siempre una instrucción Try…Catch…Finally para garantizar que si algo falla, la conexión se cerrará. De lo contrario, la conexión puede permanecer abierta de forma indefinida. El siguiente código de un objeto DataReader captura errores y cierra la conexión: Try conn.Open() dr = cmdAuthors.ExecuteReader() 'use the returned data in the DataReaders Catch e As Exception 'handle the error Finally dr.Close() conn.Close() End Try try { conn.Open(); dr = cmdAuthors.ExecuteReader(); // use the returned data in the DataReaders } catch(Exception e) { // Handle error } finally { dr.Close(); conn.Close(); } Do While myReader.Read() str &= myReader(1) str &= myReader("field") str &= myReader.GetDateTime(2) Loop while (myReader.Read()) { str += myReader[1]; str += myReader["field"]; str += myReader.GetDateTime(2); } Leer datos desde un DataReader Invocar Read para cada registro Visual Basic .NET C# Tras invocar el método ExecuteReader del objeto Command, podemos acceder a un registro del objeto DataReader invocando el método Read. El objeto DataReader se posiciona de modo predeterminado antes del primer registro; por tanto, debemos invocar el método Read antes de acceder a algún dato. Cuando ya no hay más registros disponibles, el método Read devuelve un valor nulo. El siguiente código recorre todos los registros de un objeto DataReader dr, y muestra el campo au_fname en el control Label lblName: Do While dr.Read() lblName.Text &= dr("au_fname") Loop while (dr.Read()) { lblName.Text += dr["au_name"]; } while (myReader.Read()) { str += myReader[1]; str += myReader["field"]; Do While myReader.Read() str &= myReader(1) str &= myReader("field") str &= myReader.GetDateTime(2) Acceso a campos Para obtener los datos de los campos del registro actual, podemos acceder a un campo por su posición ordinal, por su nombre o invocando un método Get adecuado, como GetDateTime, GetDouble, GetInt32 o GetString. Sugerencia Utilizar un método Get específico es más rápido que acceder por la posición ordinal o por el nombre, porque el DataReader no necesita comprobarel formato de los datos. Visual Basic .NET C# Visual Basic .NET C# Cerrar el DataReader Visual Basic .NET C# Cerrar la conexión Visual Basic .NET C# C# Por ejemplo, el siguiente código de ejemplo lee los campos del primer y último nombre, ambos valores de cadena, desde el primer registro del objeto DataReader dr, utilizando el método GetString(): dr.Read() lblName.Text = dr.GetString(1) + ", " + _ dr.GetString(2) dr.Read(); lblName.Text = dr.GetString(1) + ", " + dr.GetString(2); También podemos referenciar, por nombre, los campos de datos del registro actual del objeto DataReader. Seguidamente, podemos invocar una función de conversión apropiada, como muestra el siguiente código de ejemplo: myReader("au_fname") myReader["au_fname"]; Mientras el objeto DataReader está en uso, la conexión asociada está ocupada dando servicio al objeto DataReader. Por tanto, debemos invocar el método Close para cerrar el objeto DataReader cuando finalicemos su uso, como muestra el siguiente código de ejemplo: myReader.Close() myReader.Close(); DataReader no cierra automáticamente la conexión. Debemos invocar explícitamente el método Close para cerrar la conexión cuando finalicemos su uso, como muestra el siguiente código de ejemplo: conn.Close() conn.Close() ---------------------------------------------------- Referencia: • PPT ADO.NET Microsoft
Compartir