Logo Studenta

ACCESO CONECTADO DATAREADER

¡Estudia con miles de materiales!

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

Continuar navegando