web-dev-qa-db-ja.com

SqlDataReader対SqlDataAdapter:DataTableを返すためのパフォーマンスが優れているのはどれですか?

DataTableを返すパフォーマンスが優れているものを知りたいです。ここではSqlDataReaderDataTable.Load(dr)を使用します

SqlDataReaderを使用:

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

SqlDataAdapterを使用:

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

違いはごくわずかなので、おそらくより簡潔なバージョンSqlDataAdapter.Fillを使用することをお勧めします。

SqlDataReader.Fillは内部クラスLoadAdapterDataAdapterから派生)を内部で作成し、そのFillメソッドを呼び出します。パフォーマンスはSqlDataAdapter.Fill(DataTable)と非常に似ています。

引数の初期化/検証には若干の違いがありますが、行の数が増えると、これはますます重要ではなくなります。

また、最初のサンプルと比較できるように2番目のサンプルを変更する必要があることに注意してください。

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

この質問 、より具体的には この回答 は、2番目の例のほうが速いことを示唆しています。確かに包括的なベンチマークではありませんが、興味深いテストです。

DataTableのソースコードを反映すると、DataTable.Load()を呼び出すと、実際にDataAdapterという内部LoadAdapterサブクラスが作成され、DataAdapterFill()メソッドが呼び出されます。 。 SqlDataAdapterは、ロード作業の大部分をまったく同じ場所で行います。

さらに重要なことは、読みやすさのために2番目の例を好む傾向があることです。どちらの例も、DataReaderを直接使用することで提供される高速アクセスと比較しないため、よりクリーンなコードを選択します。

8
Tim Medora

SqlDataReaderは、歴史的にSqlDataAdapterよりもかなり高速です。 .NET 4.5で改善が行われた可能性がありますが、DataReaderのパフォーマンスを上回るほど改善されているとは思いません。

4
Rob Epstein

選択したソリューションに加えて、私はそれを追加したいと思います:

DataReaderを使用すると、所有しているDbConnectionのタイプを知る必要がありません。

必要なのは、IDbConnectionを実装するインスタンスだけです。これにより、「connection.CreateCommand」、「dbCommand.ExecuteReader」、dataTable.Loadの順に使用できます。

ただし、DataAdapterを使用する場合は、使用されている接続(つまり、Oracle、sqlserverなど)を知る必要があります。

(スレッドスターターには関係ありませんが、このトピックを探しながらg ** gleを使用してここに行きました。)

0
just_a_guest

SqlDataReaderは、接続状態で動作するため、SQlDataAdapterより高速です。つまり、最初の結果が使用可能になるとすぐにクエリから返されます。

0
coder