LIKE
Windowsフォームのテキスト入力を介して値が提供される列の比較に基づいて、Sql Server DBに行数を照会しているとします。ここでパラメーターを使用することは、ユーザー入力がインジェクションにつながる可能性があるため重要です。ExecuteScalar()
最終的には、名前を付けたインスタンス化されたSqlCommand
オブジェクトでメンバー関数を実行しますcmd
が、最初にパラメーターを追加する必要があります。例えば:
cmd.Parameters.AddWithValue("@param1", textBox1.Text);
Sql Server は、比較%
のためのワイルドカード マッチとして特殊文字を使用します。LIKE
私がやりたかったのは、ユーザーが*
代わりにワイルドカードを使用できるようにすることでした。したがって、単純な置換:
textBox1.Text.Replace('*','%');
問題は、特殊記号%
と_
. %
ワイルドカードとして使用するのではなく、リテラルを検索する 1 つの方法は、角かっこで囲むことです[%]
。
だから、今私の置き換えは次のようになる必要があります:
textBox1.Text.Replace("%","[%]").Replace("_","[_]").Replace('*','%');
ここでも順序が重要です。最後のReplace
ものを早く作成すると、%
正しく処理されないからです。
すべてのベースをカバーしたかどうかわかりませんが、ここで心配する必要がある他のキャラクターはありますか? これは本当に注射から保護しますか?これを行う他の好ましい方法はありますか?
クエリの例は次のようになります。
SELECT COUNT(*) FROM [MyTable] WHERE [Column1] = @param1
はテーブルMyTable
名で、Column1
は 内の有効な列名ですMyTable
。Column1
それは何らかのnvarchar
タイプであると推測できます。