Freigeben über


Abrufen von Daten durch einen DataReader

Gilt für: .NET Framework .NET .NET Standard

Herunterladen von ADO.NET

Wenn Sie Daten mit einem DataReader-Objekt abrufen möchten, müssen Sie zunächst eine Instanz des Command-Objekts und anschließend ein DataReader-Objekt erstellen, indem Sie Command.ExecuteReader aufrufen, um Zeilen aus einer Datenquelle abzurufen. Das DataReader-Objekt stellt einen ungepufferten Datenstrom bereit, mit dem prozeduraler Logik eine effektive sequenzielle Verarbeitung der Ergebnisse aus einer Datenquelle ermöglicht wird.

Hinweis

Das DataReader-Objekt ist gut für das Abrufen großer Datenmengen geeignet, da die Daten nicht im Arbeitsspeicher zwischengespeichert werden.

Im folgenden Beispiel wird die Verwendung eines DataReader-Objekts gezeigt, wobei reader für ein gültiges DataReader-Objekt und command für ein gültiges Command-Objekt steht.

reader = command.ExecuteReader();  

Verwenden Sie die DataReader.Read-Methode, um eine Zeile aus den Abfrageergebnissen abzurufen. Sie können auf jede Spalte der zurückgegebenen Zeile zugreifen, indem Sie dem DataReader-Objekt den Namen oder die Ordinalzahl der Spalte übergeben. Die beste Leistung erzielen Sie jedoch, wenn Sie die vom DataReader-Objekt bereitgestellten Methoden verwenden, mit denen Sie auf Spaltenwerte in ihren nativen Datentypen zugreifen können (z. B. GetDateTime, GetDouble, GetGuid oder GetInt32). Eine Liste mit typisierten Accessormethoden für anbieterspezifische DataReader-Objekte finden Sie unter SqlDataReader. Mit den typisierten Accessormethoden wird die Menge der beim Abrufen des Spaltenwerts erforderlichen Typkonvertierungen reduziert, wenn der zugrunde liegende Datentyp bekannt ist.

Im folgenden Beispiel wird ein DataReader-Objekt durchlaufen, wobei von jeder Zeile zwei Spalten zurückgegeben werden.

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

Schließen von DataReader

Wenn das DataReader-Objekt nicht mehr benötigt wird, sollten Sie immer die Close()-Methode aufrufen.

Hinweis

Wenn Ihr Command-Objekt Ausgabeparameter oder Rückgabewerte enthält, sind diese Werte erst nach dem Schließen des DataReader-Objekts verfügbar.

Wichtig

Solange ein DataReader-Objekt geöffnet ist, wird das Connection-Objekt ausschließlich von diesem DataReader-Objekt verwendet. Sie können erst dann Befehle für das Connection-Objekt ausführen, z. B. um ein anderes DataReader-Objekt zu erstellen, wenn das ursprüngliche DataReader-Objekt geschlossen wurde.

Hinweis

Rufen Sie Close oder Dispose nicht für Connection- oder DataReader-Objekte oder andere verwaltete Objekte in der Finalize-Methode Ihrer Klasse auf. Geben Sie in einer Finalize-Methode nur nicht verwaltete Ressourcen frei, die der Klasse direkt gehören. Wenn Ihre Klasse keine nicht verwalteten Ressourcen aufweist, verwenden Sie in Ihrer Klassendefinition keine Finalize-Methode. Weitere Informationen finden Sie unter Garbage Collection.

Abrufen mehrerer Resultsets mit NextResult

Wenn das DataReader-Objekt mehrere Resultsets zurückgibt, rufen Sie die NextResult-Methode auf, um die Resultsets nacheinander zu durchlaufen. Im folgenden Beispiel werden die Ergebnisse von zwei SELECT-Anweisungen mit der SqlDataReader-Methode von ExecuteReader verarbeitet.

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

Abrufen von Schemainformationen aus dem DataReader-Objekt

Solange ein DataReader-Objekt geöffnet ist, können Sie mit der GetSchemaTable-Methode Schemainformationen zum aktuellen Resultset abrufen. GetSchemaTable gibt ein DataTable-Objekt zurück, das mit Zeilen und Spalten gefüllt ist, die die Schemainformationen für das aktuelle Resultset enthalten. Das DataTable-Objekt enthält eine Zeile für jede Spalte des Resultsets. Jede Spalte der Schematabelle ist einer Eigenschaft der zurückgegebenen Spalten in den Zeilen des Resultsets zugeordnet, wobei ColumnName der Name der Eigenschaft und der Spaltenwert der Wert der Eigenschaft ist. Im folgenden Beispiel werden die Schemainformationen für DataReader abgerufen.

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

Weitere Informationen