2011-12-20 7 views
0

テーブルをクエリしているとします。ヌルが検索する値の1つである可能性があります。挨拶がnullのときに、このパラメータ化されたクエリでnullable値を処理する適切な方法はありますか?

command.CommandText = "select * from People where Saluation = @salutation"; 

if(salutation != null) command.Parameters.AddWithValue("@salutation", salutation); 
else command.Parameters.AddWithValue("@salutation", DBNull.Value); 

のようにセットアップされたクエリは結果を返しません。だから私はこれを代わりにする傾向がありますが、それは私には醜い感じです:

string whereClause; 
if(!string.IsNullOrEmpty(salutation)) 
{ 
    whereClause = "Salutation = @salutation"; 
    command.Parameters.AddWithValue("@salutation", salutation); 
} 
else whereClause = "Salutation is null"; 

command.CommandText = "select * from People where " + whereClause; 

もっと正しい方法がありますか?

答えて

3

where節を作成するために連結を避けるのがおそらくでしょう。 sqlを次のように変更することができます。 SQL Injections攻撃のために自分自身を開くかもしれません。

command.CommandText = "select * from People where (@salutation is null and salutation is null) or Saluation = @salutation"; 
+1

外部ストリングが連結されていない場合、連結によりインジェクションの脆弱性が作成されません。 –

+0

本当に悪い習慣に入るのは簡単です。 –

+0

@salutationがnullの場合、元のバージョンはすべての行を返します。@salutationはnullであり、salutationはnullです。私はちょうど編集を投稿し、それがピアレビューを経ると受け入れます。 –

0

おそらくCOALESCE関数を使用して、デフォルト値を2番目のパラメータとして設定することができます。

1

null値を返すかどうかを指定する余分なパラメータを追加して、クエリをわずかに変更することができます。

あなたの例を使用するには:これは、あなたが完全にパラメータクエリを保つことができます

command.CommandText = "select * from People where ((@IsNull_Salutation = 1 AND Salutation IS NULL) OR (Saluation = @Salutation))"; 

command.Parameters.AddWithValue("Salutation", salutation ?? (object)DBNull.Value); 
command.Parameters.AddWithValue("IsNull_Salutation", (salutation == null) ? 1 : 0); 

を。 null値を返すことを止めることを決定した場合は、渡す値をIsNull_Salutationパラメータに変更するだけで済みます。

メモリからは、SqlCommandBuilderクラスが自動生成された挿入/更新/削除クエリでNULL値を処理する方法と似ています。

-1
command.CommandText = "select * from People where Saluation "; 
command.CommandText += salutation != null ? ("= " + salutation) : "is NULL"; 
+4

私は好きな敬礼を伝えます: '1;ドロップテーブルの人々; ':) – MatthewKing

+2

-1パラメータ化されたクエリを使用せず、JovieeがSoylent Greenを破壊できるようにするためです。 –

0

それをシンプルに保つ: ちょうど

WHERE @field IS NULL OR field = @field 

SQL Serverが@Fieldパラメータの値に基づいて適切な条件を使用するのに十分スマートであるようにWHERE句を使用します。 このシナリオで重要なことは、SELECT stmtで使用される前にクエリのパラメータ値を変更しないことです。

関連する問題