2

次のような SQLquery のパラメーター化されたクエリを作成したいと思います。

SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN (1, 2, 3));

値は WS インターフェイスから取得されます。消費者を信頼できますが、安全にプレイし、DbParameters を含むパラメーター化されたクエリを使用して SQL インジェクションを防ぎたいと考えています。どうやってするの?

ありがとう!

4

3 に答える 3

3

お気づきのように、キーポイントはパラメーターを使用することです。IN句は、厄介なことに、そのために悪名高い問題があります。ここで、値がすべて整数であることがわかっている場合 (たとえばint[]、C# メソッドにパラメーターを取得している場合)、次のようなことでほぼ問題を解決できます。

cmd.CommandText = "SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN ("
+ string.Join(",", values) + "))"; // please don't!!!

それは恐ろしく、非常に悪い習慣を示唆しています (誰かが文字列のためにそれをコピーした場合、あなたは苦痛の世界にいます)、クエリプランのキャッシュを使用できません。次のようなことができます:

var sb = new StringBuilder("SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN (");
int idx = 0;
foreach(var val in values) {
    if(idx != 0) sb.Append(',');
    sb.Append("@p").Append(idx);
    cmd.Parameters.AddWithValue("@p" + idx, val);
    idx++
}
sb.Append("))");
cmd.CommandText = sb.ToString();

これは好ましいが厄介です。

または最も簡単: dapperのようなツールを使用して、ライブラリに心配させます。

var data = conn.Query<YourType>(
    "SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN @values)",
    new { values });

ここでdapperは使用法を見つけ、「正しいことを行います」。また、「0 値」のケースも処理します。

于 2013-03-08T13:55:01.430 に答える
1

これが1つの例です:

SqlCommand cmd = new SqlCommand("SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 = @myparam", conn);

//define parameters used in command object
SqlParameter param  = new SqlParameter();
param.ParameterName = "@myparam";
param.Value         = "myvalue";

//add new parameter to command object
cmd.Parameters.Add(param);

// get data stream
reader = cmd.ExecuteReader();

詳細については、次のリンクを確認してください: http: //csharp-station.com/Tutorial/AdoDotNet/Lesson06

于 2013-03-08T13:50:24.630 に答える
1

ここで難しいのは、個々の IN 句をパラメータ化して、可変数の ID を渡すことができるようにすることです。

これを解決するための 1 つのアプローチについては、次の便利な記事をご覧ください。

基本的に、IN 句のパラメーター化されたリストを構築するために少し文字列操作を行う必要があるため、3 つの ID を持つ特定の例では、次のような SQL ステートメントになります。

select * from TABLE1 where COL1 in (select COL2 from TABLE2 where COL3 IN (@p1, @p2, @p3));
于 2013-03-08T13:53:40.213 に答える