2009-04-23 11 views
5

sqlステートメントをINを使用してC#LinQからsql datacontextに実行する最良の方法は何ですか?私が試してみました:Datacontext INステートメントのExecuteCommandパラメーター

の変換に失敗しました:私は、たとえば「2,1」を通じ掲示取得する場合、フォームを通過した1つの項目の罰金ですが、

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

が、私はsqlclient例外を取得しますnvarchar値 '2,1'をデータ型intに変換するときに発生します。

代わりにパラメータを挿入するためにstring.formatを使用するとうまく動作しますが、明らかにこれはSQLインジェクションに開放されています。

答えて

4

LINQ-to-SQLは連結を使用しません。 '123,456,789'に設定@p0

WHERE id IN (@p0) 

:それは、フォームのTSQLクエリになります。

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

dbo.SplitCsvが多く、このような「スプリット」の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} 

インターネット上で利用可能です。