2011-10-20 9 views
14

から返されるだけ単一の行を強制しますか?は、私は私のコードでは、この非常に多くのことを書くように見えるのDataReader

+3

クエリを管理している場合はたぶん、あなたはそれに 'TOP '1'を行うことができます。..あなたのデータベースの完全性をチェックしたいならば、これを行う代わりに 'WHERE'クエリのカラムに対して' UNIQUE INDEX'を置くべきでしょう。 –

+1

あなたのSQLクエリにTOP 1を追加するのはどうですか? – Stecya

+4

私はトップ1を望んでいません、私は例外が欲しいです。彼らはまったく同じものではありません。 – fearofawhackplanet

答えて

15

私は知りませんが、このコードは、拡張メソッドに委任することができます。

public static R Single<R>(this DataReader reader, Func<DataReader,R> selector) { 
    R result = default(R); 
    if (reader.Read()) 
     result = selector(reader); 
    if (reader.Read()) 
     throw new DataException("multiple rows returned from query"); 
    return result; 
} 

はそのように使用する:

using (var reader = cmd.ExecuteReader()) 
{ 
    User u = reader.Single(r => new User((int)r["UserId"], r["UserName"].ToString())) 
} 

は、コードの重複からあなたを保存します。

+0

'SqlCommand'の拡張メソッドを作ることで、より重複したコードを避けることができます。 'User u = cmd.Single(...);' –

+0

確かに、その低レベルのAPI上で、いくつかの拡張メソッドを使って、かなり使いやすいものにすることができます:) – flq

+0

私は拡張機能が好きではありません'SqlCommand'は有用なインターフェースを実装していないのであまりにも大変です。 – fearofawhackplanet

1

SQLを使用してデータを取得する場合は、データリーダーを使用する必要があるたびにその種のコードを削除すると便利です。

SELECT TOP ([Number of rows you want to be selected]) 
FROM [Table Name] 
WHERE [Condition] 

EX:

SELECT TOP (1) 
FROM tblUsers 
WHERE Username = 'Allan Chua' 

別のチップを使用ストアドプロシージャ、SQLクエリと、不要なコーディングの繰り返しを最小限に抑えることができ、それらを使用します。

8

これは、あなたの目標が何であるかに応じて役立つかもしれません。適切な例外をスローするために複数の行が返されたことを検出する必要がある場合、これは役に立ちません。

結果が1つのみ返されるようにするには、このメソッドを使用してパフォーマンスバンプを取得する可能性があります。私が理解しているところでは、データプロバイダはこれを使用して、単一の行結果を予期してクエリを最適化することができます。

いずれの場合でも、SqlCommand.ExecuteReaderを使用してデータリーダーを作成し、CommandBehavior列挙(特にCommandBehavior.SingleRow)から引数を渡します。 ExecuteReaderはこれを受け入れるためにオーバーロードされます。

CommandBehavior enum

SqlCommand.ExecuteReader overload

だからあなたのコードは次のようになります。

using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (reader.Read()) 
    { 
     result = new User((int)reader["UserId"], reader["UserName"].ToString()); 
    } 
} 
関連する問題