0

EF5 で複数の行を削除しようとしており、次のコード サンプルを使用しています。

string TestId = "12,23";
Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId));

SqlParameterに合格するにはどうすればよいINですか? コンマ区切り値の文字列を渡そうとしています

ありがとう

4

1 に答える 1

0

TESTID IN (...)SQL クエリ部分で動的な数の値を渡すことができる唯一の方法は、副選択を使用することです。これは SQL クエリ自体に適用されるため、問題を解決するパラメーターの型はありません。

別の方法として、文字列の連結と各引数の慎重な検証を使用して、クエリを動的に作成することもできます。

ID を使用しているため、ID はおそらく整数です。

List<int> testId = ...;
var sb = new StringBuilder();
sb.Append("DELETE FROM TEST WHERE TESTID IN (");
bool first = true;
foreach (var i in testId)
{
    if (first)
        first = false;
    else
        sb.Append(",");
    sb.Append(i.ToString(CultureInfo.InvariantCulture));
}
sb.Append(")");
Context.Database.ExecuteSqlCommand(sb.ToString());

クエリに追加される文字列引数がないため、SQL インジェクションから安全です。整数に悪意のある SQL コードが含まれることはありません。

ID の数が非常に多い (長すぎるためにコンパイル中にクエリが失敗する) 場合の通常のアプローチは、一時テーブルを作成し、そこに ID を挿入することです。

もう 1 つの方法は、XML としてフォーマットされた値を渡し、SQL クエリで XML 文字列から値を取得するサブセレクトを記述することです。

于 2013-05-22T13:30:03.133 に答える