2009-08-27 11 views
1

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

ありがとうございました!私はOleDbDataReaderソリューションを試してみました。残念ながら、私の特定のシナリオでは、OleDbDataAdapter.Fill()を使用すると、DataReaderソリューションのパフォーマンスが大幅に向上しました。 –

答えて

9

OleDbDataReaderを使用し、CommandBehavior.SingleRowを使用することを検討してください。

using (OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (reader.Read()) 
    { 
     // Bind your object using the reader. 
    } 
    else 
    { 
     // No row matched the query 
    } 
} 

SingleRowは、それが結果を処理する方法を最適化することを可能にする基礎となるOLEDBプロバイダにヒントを提供します。

+0

私は残念なことにJetを現在使用していますが、CommandBehavior.SingleRowは私のシナリオでは何の違いもありません。しかし、将来の参照のために離れてファイルしてください。 –

1

あなたは、データリーダーを使用することができます。

1

おかげ

関連する問題