Sdílet prostřednictvím


Načtení dat pomocí DataReaderu

Platí pro: .NET Framework .NET Standard

Stáhnout ADO.NET

Chcete-li načíst data pomocí DataReader, vytvořte instanci command objektu a pak vytvořte DataReadervoláním Command.ExecuteReader pro načtení řádků ze zdroje dat. DataReader poskytuje nerozbufferovaný datový proud dat, který umožňuje procedurální logiku efektivně zpracovávat výsledky ze zdroje dat postupně.

Poznámka:

Čtečka dat je dobrou volbou při načítání velkých objemů dat, protože data nejsou uložená v mezipaměti.

Následující příklad ukazuje použití DataReader, kde reader představuje platný DataReader a command představuje platný Command objekt.

reader = command.ExecuteReader();  

K získání řádku z výsledků dotazu použijte metodu DataReader.Read . Ke každému sloupci vráceného řádku můžete přistupovat předáním názvu nebo pořadového čísla sloupce do DataReader. Pro nejlepší výkon však DataReader poskytuje řadu metod, které umožňují přístup k hodnotám sloupců v jejich nativních datových typech (GetDateTime, GetDouble, GetGuid, GetInt32 atd.). Seznam typovaných přístupových metod pro DataReadery specificky pro poskytovatele dat naleznete v tématu SqlDataReader. Použití metod typového přístupu, když znáte základní datový typ, snižuje potřebu převodu typů při načítání hodnoty sloupce.

Následující příklad iteruje objekt DataReader a vrátí dva sloupce z každého řádku.

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

Zavření čtečky dat

Vždy volejte metodu Close() po dokončení použití objektu DataReader .

Poznámka:

Pokud příkaz obsahuje výstupní parametry nebo návratové hodnoty, nebudou tyto hodnoty k dispozici, dokud čtečka DatReader nezavře.

Důležité

I když je DataReader otevřený, připojení je používáno výhradně tímto DataReaderem. Nelze spustit žádné příkazy pro připojení, včetně vytvoření jiného Objektu DataReader, dokud původní Objekt DataReader nebude uzavřen.

Poznámka:

Nevolejte Close nebo Dispose pro Connection, DataReader nebo jakýkoli jiný spravovaný objekt v metodě Finalize vaší třídy. V finalizátoru uvolněte pouze nespravované prostředky, které vaše třída vlastní přímo. Pokud vaše třída nevlastní žádné nespravované prostředky, nezahrnujte do definice třídy metodu Finalize . Další informace naleznete v tématu Uvolňování paměti.

Načtení více sad výsledků pomocí nextResult

Pokud DataReader vrátí více sad výsledků, zavolejte metodu NextResult, abyste postupně procházeli přes sady výsledků. Následující příklad ukazuje, jak SqlDataReader zpracovává výsledky dvou příkazů SELECT metodou 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();
    }
}

Získání informací o schématu z DataReaderu

Zatímco je DataReader otevřen, můžete načíst informace o schématu aktuální sady výsledků pomocí metody GetSchemaTable. Funkce GetSchemaTable vrátí DataTable objekt naplněný řádky a sloupci, které obsahují informace o schématu pro aktuální sadu výsledků. Tabulka DataTable obsahuje jeden řádek pro každý sloupec sady výsledků. Každý sloupec tabulky schématu se mapuje na vlastnost sloupců vrácených v řádcích sady výsledků, kde ColumnName je název vlastnosti a hodnota sloupce je hodnota vlastnosti. Následující příklad zapíše informace o schématu pro 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();
    }
}

Viz také