29

を返すためにどちらがより良いパフォーマンスを持っているか知りたいですDataTable。ここでSqlDataReader私は使用しますDataTable.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];
}
4

5 に答える 5

28

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

SqlDataReader.Fill内部クラスLoadAdapter( から派生DataAdapter) を内部的に作成し、そのメソッドを呼び出します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;
    }
}
于 2013-02-21T10:24:05.967 に答える
8

This question、より具体的には、この回答は、2番目の例の方が高速であることを示唆しています。これは完全なベンチマークではありませんが、興味深いテストです。

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

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

于 2013-02-21T10:29:11.987 に答える
5

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

于 2013-02-21T09:59:20.430 に答える
0

選択したソリューションに加えて、次のことを追加したいと思います。

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

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

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

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

于 2016-01-26T13:57:12.690 に答える
0

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

于 2013-02-21T10:06:49.600 に答える