Compartilhar via


Recuperar dados por um DataReader

Aplicável a: .NET Framework .NET .NET Standard

Baixar ADO.NET

Para recuperar dados usando um DataReader, crie uma instância do objeto Command e, em seguida, crie um DataReader chamando Command.ExecuteReader a fim de recuperar linhas de uma fonte de dados. O DataReader fornece um fluxo de dados não armazenado em buffer que permite que a lógica procedural processe resultados com eficiência por meio de uma fonte de dados em sequência.

Observação

O DataReader é uma boa opção ao recuperar grandes quantidades de dados porque os dados não são armazenados em cache na memória.

O exemplo a seguir ilustra o uso de um DataReader, em que reader representa um DataReader válido e command representa um objeto Command válido.

reader = command.ExecuteReader();  

Use o método DataReader.Read para obter uma linha dos resultados da consulta. É possível acessar cada coluna da linha retornada passando o nome ou o número ordinal da coluna para o DataReader. No entanto, para oferecer o melhor desempenho, o DataReader fornece uma série de métodos que permitem que você acesse valores de coluna nos tipos de dados nativos delas (GetDateTime, GetDouble, GetGuid, GetInt32 e assim por diante). Para obter uma lista dos métodos acessadores tipados para DataReaders específicos de provedor de dados, confira SqlDataReader. Usar os métodos acessadores tipados quando você já conhece o tipo de dados subjacente, reduz a quantidade de conversão de tipos necessária ao recuperar o valor da coluna.

O exemplo a seguir faz a iteração por meio de um objeto DataReader e retorna duas colunas de cada linha.

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();
    }
}

Fechar o DataReader

Sempre chame o método Close() quando terminar de usar o objeto DataReader.

Observação

Se o Command contiver parâmetros de saída ou valores de retorno, esses valores não serão disponibilizados até que o DataReader seja fechado.

Importante

Enquanto um DataReader estiver aberto, a Connection estará sendo usada exclusivamente por esse DataReader. Você não poderá executar nenhum comando usando a Connection, incluindo criar um outro DataReader, até o DataReader original esteja fechado.

Observação

Não chame Close nem Dispose em um Connection, um DataReader ou qualquer outro objeto gerenciado no método Finalize da classe. Em um finalizador, libere somente recursos não gerenciados que sua classe possui diretamente. Se a classe não tiver nenhum recurso não gerenciado, não inclua um método Finalize na definição de classe. Para obter mais informações, confira Coleta de lixo.

Recuperar vários conjuntos de resultados usando o NextResult

Se o DataReader retornar vários conjuntos de resultados, chame o método NextResult para percorrer os conjuntos de resultados em sequência. O exemplo a seguir mostra SqlDataReader processando os resultados de duas instruções SELECT usando o 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();
    }
}

Obtendo informações de esquema por meio do DataReader

Enquanto o DataReader estiver aberto, você poderá recuperar informações de esquema sobre o conjunto de resultados atual usando o método GetSchemaTable. O GetSchemaTable retorna um objeto DataTable preenchido com linhas e colunas que contêm informações de esquema do conjunto de resultados atual. O DataTable contém uma linha para cada coluna do conjunto de resultados. Cada coluna da tabela do esquema é mapeada para uma propriedade da coluna retornada nas linhas do conjunto de resultados, onde ColumnName é o nome da propriedade e o valor da coluna é o valor da propriedade. O exemplo a seguir gravará as informações de esquema para o 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();
    }
}

Confira também