C#、.Net 2.0:OleDbConnectionオブジェクトを介してアクセスするデータベースから単一のレコードをラップするクラスがあります。非常にシンプルで、 "SELECT * FROM table WHERE key = {some value};"を実行します。データを操作するためのいくつかのメソッドを使用して、フィールドをプロパティとして公開します。私は、このオブジェクトの新しいインスタンスを作成すると、実行されますコードは次のようになります。OleDbConnection経由で単一レコードをフェッチする最も良い方法は何ですか?
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
if (cmd.Connection.State != ConnectionState.Open)
{
cmd.Connection.Close();
cmd.Connection.Open();
}
da.Fill(ds);
return ds.Tables[0];
CMDメソッドに渡されたOleDbCommandオブジェクトです。これを実行すると、オブジェクトの作成に要する時間の約95%がVS 2008プロファイラに基づいてda.Fill(ds)呼び出しに含まれます。
また、IEnumerableを実装するこれらのオブジェクトのコレクションを表すクラスがあり、foreachを使用してそのオブジェクトを反復すると、各単一レコードオブジェクトがオンザフライで作成され、それらのda.Fill(ds)ステートメントがすばやく追加されます。
私の質問は、単一のレコードをフェッチするための最良の方法ですか?代わりに、コレクションオブジェクトを実装するためのより好ましい方法がありますので、繰り返しはそれほど時間がかかりません。あなただけの1つの結果、 を期待している場合は、ExecuteScalar
それは、最初の行の最初の列を返しますを使用することができ
using (var connection = new OleDbConnection(connectionString))
{
connection.Open();
var command = new OleDbCommand(queryString, connection);
var reader = command.ExecuteReader();
var person = new Person();
if (reader.Read())
{
person.Name = reader["Name"].ToString();
person.Age = Convert.ToInt32(reader["Age"]);
}
return person;
}
ありがとうございました!私はOleDbDataReaderソリューションを試してみました。残念ながら、私の特定のシナリオでは、OleDbDataAdapter.Fill()を使用すると、DataReaderソリューションのパフォーマンスが大幅に向上しました。 –