En ADO.NET , un DataReader es una amplia categoría de objetos que se utilizan para leer datos secuencialmente desde una fuente de datos. [ 1 ] Los DataReaders proporcionan una forma muy eficiente de acceder a los datos y pueden considerarse como un cursor Firehose de ASP Classic , con la diferencia de que no se utiliza ningún cursor del lado del servidor . Un DataReader analiza un flujo de datos tabular de Microsoft SQL Server y otros métodos para recuperar datos de otras fuentes.
Un DataReader suele ir acompañado de un objeto Command que contiene la consulta, opcionalmente cualquier parámetro, y el objeto de conexión en el que se ejecutará la consulta.
Tipos de DataReader
En ADO.NET no existe una clase DataReader , pero sí hay varias clases que implementan la interfaz IDataReader :
- System.Data.SqlClient.SqlDataReader
- Sistema.Data.OleDb.OleDbDataReader
- Oracle.OracleClient.OracleDataReader
Los DataReaders tienen un tamaño reducido y un buen rendimiento, ya que cada uno está diseñado específicamente para la tarea en cuestión. Sin embargo, esto dificulta el desarrollo de aplicaciones que puedan migrarse de una fuente de datos a otra. Algunos DataReaders específicos del proveedor exponen los tipos utilizados por la base de datos subyacente; por ejemplo, los valores enteros pueden ser nulos en Microsoft SQL Server, pero no en .NET Framework antes de la versión 2.0.
Tipificación fuerte versus débil
Al usar un DataReader para recuperar datos, el desarrollador puede optar por leer los valores de los campos de forma fuertemente tipada ( ejemplo: myReader.GetString(12) ) o de forma débilmente tipada, devolviéndolos como System.Object ( ejemplo: ). Ambos enfoques tienen sus pros y sus contras.myReader.GetValue(12)
El uso de métodos de recuperación fuertemente tipados puede resultar más engorroso, especialmente sin un conocimiento específico de los datos subyacentes. Los valores numéricos en la base de datos pueden traducirse a varios tipos de .NET : Int16 , Int32 , Int64 , Float , Decimal o Currency . Intentar recuperar un valor con un tipo incorrecto genera una excepción, lo que detiene la ejecución del código y ralentiza la aplicación. Esto también ocurre cuando se utiliza el tipo correcto, pero se encuentra un valor DbNull ( esto se puede evitar utilizando la función booleana IsDbNull de la clase DataReader ). La ventaja de este método de recuperación es que la validación de datos se realiza antes, lo que aumenta la probabilidad de que sea posible corregir los datos.
La recuperación de datos con tipado débil permite escribir código rápidamente y utilizar los datos de alguna manera, incluso cuando el desarrollador desconoce de antemano qué tipos se devolverán. Además, con un poco de esfuerzo, el programador puede extraer el valor y almacenarlo en una variable del tipo adecuado mediante los métodos GetFieldType o GetDataTypeName del DataReader.
Errores comunes
En algunos casos, se puede usar un DataReader en lugar de un DataTable ; sin embargo, muchos programadores han experimentado problemas de sobrecarga de conexiones al seguir este enfoque. Un DataReader solo se puede usar con una conexión de base de datos ya abierta ; dicha conexión no se cierra hasta que se llama al método Dispose del DataReader . Si se produce una excepción durante el procesamiento de los datos, como se describe en la sección "Tipado fuerte y débil" anterior, el método Dispose nunca se llamará si el desarrollador escribe código que declare y libere explícitamente el DataReader sin usar un bloque try - finally . La construcción using de C# es una buena manera de evitar este problema, como se muestra a continuación en el ejemplo de código.
Código de ejemplo
Ejemplo de acceso a datos SQL mediante DataReader
void DataTest () { using ( SqlConnection conn1 = new SqlConnection (...)) { conn1 . Open (); SqlCommand mycommand = new SqlCommand ( "select * from someTable" , conn1 ); using ( SqlDataReader myreader = mycommand . ExecuteReader ()) { if ( myreader != null ) while ( myreader . Read ()) Console . WriteLine ( myreader . GetValue ( 0 ). ToString () + ":" + myreader . GetTypeName ( 0 ));} micomando.Dispose ( ) ; } }using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Data.Odbc ; using MySql.Data.MySqlClient ;espacio de nombres ConsoleApplication1 ;clase Program { static void Main ( string [] args ) { string Conn = "Server=localhost;Uid=root;Pwd=thiru;Database=Employee" ; MySql . Data . MySqlClient . MySqlConnection conn = new MySql . Data . MySqlClient . MySqlConnection ( Conn ); MySqlCommand comm = new MySqlCommand ( "select * from emp" , conn ); conn . Open ();MySqlDataReader Ada = comm.ExecuteReader ( ) ; while ( Ada.Read ( ) ) { Console.WriteLine ( Ada [ 0 ] ) ; } } }Referencias
- ↑ "Adaptadores de datos y lectores de datos" . docs.microsoft.com . Microsoft . Consultado el 4 de septiembre de 2017 .
- Polli, Andrea (10 de octubre de 2004). «DATAREADER: Una herramienta para colaboraciones entre arte y ciencia» . Actas de la 12.ª conferencia internacional anual de la ACM sobre multimedia . Association for Computing Machinery. págs. 520-523 . doi : 10.1145/1027527.1027654 . ISBN 1-58113-893-8Consultado el 22 de marzo de 2025 .
- Acceso a datos SQL
- Tecnologías de acceso a datos ADO.NET
- Interfaces de programación de aplicaciones de Microsoft