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];
}
違いはごくわずかなので、おそらくより簡潔なバージョン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;
}
}
この質問 、より具体的には この回答 は、2番目の例のほうが速いことを示唆しています。確かに包括的なベンチマークではありませんが、興味深いテストです。
DataTable
のソースコードを反映すると、DataTable.Load()を呼び出すと、実際にDataAdapter
という内部LoadAdapter
サブクラスが作成され、DataAdapter
のFill()
メソッドが呼び出されます。 。 SqlDataAdapter
は、ロード作業の大部分をまったく同じ場所で行います。
さらに重要なことは、読みやすさのために2番目の例を好む傾向があることです。どちらの例も、DataReader
を直接使用することで提供される高速アクセスと比較しないため、よりクリーンなコードを選択します。
SqlDataReader
は、歴史的にSqlDataAdapter
よりもかなり高速です。 .NET 4.5で改善が行われた可能性がありますが、DataReaderのパフォーマンスを上回るほど改善されているとは思いません。
選択したソリューションに加えて、私はそれを追加したいと思います:
DataReaderを使用すると、所有しているDbConnectionのタイプを知る必要がありません。
必要なのは、IDbConnectionを実装するインスタンスだけです。これにより、「connection.CreateCommand」、「dbCommand.ExecuteReader」、dataTable.Loadの順に使用できます。
ただし、DataAdapterを使用する場合は、使用されている接続(つまり、Oracle、sqlserverなど)を知る必要があります。
(スレッドスターターには関係ありませんが、このトピックを探しながらg ** gleを使用してここに行きました。)
SqlDataReaderは、接続状態で動作するため、SQlDataAdapterより高速です。つまり、最初の結果が使用可能になるとすぐにクエリから返されます。