wake-up-neo.net

SqlDataReader vs SqlDataAdapter: Welcher hat die bessere Leistung für die Rückgabe einer DataTable?

Ich möchte wissen, welche die bessere Leistung für die Rückgabe einer DataTable hat. Hier für SqlDataReader benutze ich DataTable.Load(dr)

SqlDataReader verwenden:

public static DataTable populateUsingDataReader(string myQuery)
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(constring))
    {
        SqlCommand cmd = new SqlCommand(myQuery, con);
        con.Open();
        SqlDataReader dr = null;
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        if (dr.HasRows)
        {
            dt.Load(dr);
        }
        return dt;
    }
}

mit SqlDataAdapter:

public DataTable populateUsingDataAdapter(string myQuery)
{
    SqlDataAdapter dap = new SqlDataAdapter(myQuery,cn);
    DataSet ds = new DataSet();
    dap.Fill(ds);
    return ds.Tables[0];
}
23
Satinder singh

Der Unterschied wird vernachlässigbar sein, daher ist es wahrscheinlich besser, die knappere Version zu verwenden: SqlDataAdapter.Fill.

SqlDataReader.Fill erstellt intern eine interne Klasse LoadAdapter (abgeleitet von DataAdapter) und ruft die Fill-Methode auf: Die Leistung ist der von SqlDataAdapter.Fill(DataTable) sehr ähnlich.

Bei der Initialisierung/Validierung von Argumenten gibt es einige kleine Unterschiede. Mit zunehmender Anzahl der Zeilen wird dies jedoch weniger wichtig.

Beachten Sie auch, dass Ihre zweite Probe so modifiziert werden sollte, dass sie mit der ersten vergleichbar ist:

public DataTable populateUsingDataAdapter(string myQuery)
{
    using (SqlConnection con = new SqlConnection(constring))
    {
        SqlDataAdapter dap = new SqlDataAdapter(myQuery,con);
        DataTable dt = new DataTable();
        dap.Fill(dt);
        return dt;
    }
}
23
Joe

Diese Frage und insbesondere diese Antwort lässt darauf schließen, dass Ihr zweites Beispiel schneller ist. Es ist sicherlich kein erschöpfender Benchmark, aber es ist ein interessanter Test.

Der Quellcode von DataTable zeigt, dass der Aufruf von DataTable.Load () tatsächlich eine interne DataAdapter-Unterklasse mit dem Namen LoadAdapter erstellt und die Fill()-Methode von DataAdapter aufruft. SqlDataAdapter führt den größten Teil der Ladearbeit an genau derselben Stelle aus.

Noch wichtiger ist, ich würde das zweite Beispiel für die Lesbarkeit bevorzugen. Keines der Beispiele ist vergleichbar mit dem schnellen Zugriff, der durch die direkte Verwendung der Variablen DataReader bereitgestellt wird. Daher würde ich mich für den Cleaner-Code entscheiden.

8
Tim Medora

SqlDataReader war historisch bedeutend schneller als SqlDataAdapter. In .NET 4.5 wurden möglicherweise Verbesserungen vorgenommen, aber ich bezweifle, dass es sich verbessert hat, um die Leistung des DataReader zu übertreffen.

4
Rob Epstein

Ich möchte zusätzlich zur ausgewählten Lösung Folgendes hinzufügen:

Mit dem DataReader müssen Sie nicht wissen, welche Art von DbConnection Sie haben.

Sie benötigen lediglich eine Instanz, die IDbConnection implementiert. Damit können Sie "connection.CreateCommand" und dann "dbCommand.ExecuteReader" und dann dataTable.Load verwenden.

Wenn Sie DataAdapter verwenden, müssen Sie jedoch wissen, welche Verbindung verwendet wird (z. B. Oracle, SQL Server usw.).

(Dies ist für den Threadstarter nicht relevant, aber ich bin hier mit g ** gle gelandet, als ich nach diesem Thema gesucht habe.)

0
just_a_guest

SqlDataReader ist schneller als SQlDataAdapter, da es in einem verbundenen Zustand arbeitet, dh das erste Ergebnis wird von der Abfrage zurückgegeben, sobald es verfügbar ist.

0
coder