5

C#LinQからSQLデータコンテキストsqlを使用してカスタムステートメントを実行するための最良の方法は何ですか?IN私が試してみました:

db.ExecuteCommand(
   "UPDATE tblCard SET used = 1 WHERE id IN ({0}) AND customer_id = {1}",
   Request.Form["ids"], customer_id
);

これは、フォームを通過した1つのアイテムには問題ありませんが、たとえば「2,1」を介して投稿された場​​合、sqlclient例外が発生します。

nvarchar値「2,1」をデータ型intに変換するときに変換に失敗しました。

代わりにstring.formatを使用してパラメーターを挿入すると、正常に機能しますが、明らかにこれはSQLインジェクションに対してオープンです。

4

1 に答える 1

4

LINQ-to-SQLは連結を使用しません。これは、次の形式のTSQLクエリになります。

WHERE id IN (@p0) 

@p0設定し'123,456,789'ます。

通常のLINQでは、を使用できますContains。いくつExecuteQueryかのオプションがあります。たとえば、CSVを「そのまま」渡し、UDFを使用してデータベースでこれを分割し、それに参加することができます。

UPDATE c SET c.used = 1
FROM dbo.SplitCsv({0}) udf
INNER JOIN tblCard c
        ON c.Id = udf.Value
       AND c.Customer_ID = {1}

dbo.SplitCsvインターネット上で利用可能な多くのそのような「分割」udfsの1つはどこにありますか。

于 2009-04-23T14:10:01.710 に答える