Datacontext ExecuteCommand中IN语句的参数

5

如何在C# LinQ to sql数据上下文中使用IN运行自定义的sql语句?我尝试过以下方法:

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

这对于单一项目通过表单时没有问题,但是如果例如通过“2,1”发送,则会出现sqlclient异常:

将nvarchar值“2,1”转换为int数据类型时转换失败。

如果改用string.format插入参数,则可以正常工作,但显然容易受到SQL注入的攻击。

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是互联网上众多类似“分裂”UDF之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接