代码之家  ›  专栏  ›  技术社区  ›  Matthew Hood

In语句中的DataContext ExecuteCommand参数

  •  5
  • Matthew Hood  · 技术社区  · 16 年前

    运行自定义的最佳方法是什么 sql 语句使用 IN 从C Linq到SQL数据上下文?我已经尝试过:

    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注入是开放的。

    1 回复  |  直到 10 年前
        1
  •  4
  •   Marc Gravell    16 年前

    linq to sql不使用concatenation;这将是一个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之一。