Recuperación de datos mediante un objeto DataReader
Se aplica a: .NET Framework .NET .NET Standard
Para recuperar datos mediante un objeto DataReader, cree una instancia del objeto Command y, después, un objeto DataReader mediante la llamada a Command.ExecuteReader para recuperar filas de un origen de datos. DataReader proporciona un flujo de datos no almacenado en búfer que permite a la lógica de procedimientos procesar de forma eficaz y secuencial los resultados de un origen de datos.
Nota
DataReader es la mejor opción cuando se trata de recuperar grandes cantidades de datos, ya que estos no se almacenan en la memoria caché.
En el ejemplo siguiente se muestra cómo se usa un objeto DataReader, donde reader
representa una instancia válida de DataReader y command
un objeto Command válido.
reader = command.ExecuteReader();
Use el método DataReader.Read para obtener una fila de los resultados de la consulta. Para acceder a cada columna de la fila devuelta, puede pasar al objeto DataReader el nombre o número ordinal de la columna. Pero para obtener el mejor rendimiento, el objeto DataReader proporciona una serie de métodos que permiten acceder a los valores de columna en sus tipos de datos nativos (GetDateTime, GetDouble, GetGuid, GetInt32, etc.). Para obtener una lista de métodos de descriptor de acceso con tipo para objetos DataReader específicos del proveedores de datos, vea SqlDataReader. Al usar los métodos de descriptor de acceso con tipo cuando se conoce el tipo de datos subyacente, se reduce el número de conversiones de tipo necesarias para recuperar el valor de columna.
En el ejemplo de código siguiente se realiza una iteración por un objeto DataReader y se devuelven dos columnas de cada fila.
static void HasRows(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Check if the DataReader has any row.
if (reader.HasRows)
{
// Obtain a row from the query result.
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}
Cierre de DataReader
Llame siempre al método Close()
cuando haya terminado de usar el objeto DataReader
.
Nota
Si Command contiene parámetros de salida o valores devueltos, no estarán disponibles hasta que se cierre el objeto DataReader.
Importante
Mientras un objeto DataReader está abierto, usa de forma exclusiva el objeto Connection. No se podrá ejecutar ningún comando para el objeto Connection hasta que se cierre el objeto DataReader original, incluida la creación de otro objeto DataReader.
Nota
No llame a Close o Dispose para objetos Connection o DataReader, ni para ningún otro objeto administrado en el método Finalize de la clase. En un finalizador, libere solo los recursos no administrados que pertenezcan directamente a su clase. Si la clase no dispone de recursos no administrados, no incluya un método Finalize en la definición de clase. Para obtener más información, consulte Recolección de elementos no utilizados.
Recuperación de varios conjuntos de resultados con NextResult
Si el objeto DataReader devuelve varios resultados, llame al método NextResult para realizar una iteración por los conjuntos de resultados de forma secuencial. En el siguiente ejemplo se muestra el SqlDataReader mientras procesa los resultados de las dos instrucciones SELECT mediante el método ExecuteReader.
static void RetrieveMultipleResults(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM dbo.Categories;" +
"SELECT EmployeeID, LastName FROM dbo.Employees",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Check if the DataReader has any row.
while (reader.HasRows)
{
Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
reader.GetName(1));
// Obtain a row from the query result.
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
// Hop to the next result-set.
reader.NextResult();
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}
Obtención de información del esquema a partir del objeto DataReader
Mientras un objeto DataReader está abierto, puede usar el método GetSchemaTable para recuperar información del esquema sobre el conjunto de resultados actual. GetSchemaTable devuelve un objeto DataTable rellenado con filas y columnas que contienen la información del esquema del conjunto de resultados actual. DataTable contiene una fila por cada una de las columnas del conjunto de resultados. Cada columna de la tabla de esquema se asocia a una propiedad de las columnas devueltas del conjunto de resultados, donde ColumnName es el nombre de la propiedad y el valor de la columna es el de la propiedad. En el ejemplo siguiente se escribe la información del esquema de DataReader.
static void GetSchemaInfo(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Retrieve schema information about the current result-set.
DataTable schemaTable = reader.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
{
foreach (DataColumn column in schemaTable.Columns)
{
Console.WriteLine(String.Format("{0} = {1}",
column.ColumnName, row[column]));
}
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}