sqlParameter转换

时间:2008-10-08 11:10:26

标签: .net sql sql-server

我正在尝试调用下面的SQL语句,但会收到以下错误:

  

System.Data.SqlClient.SqlException:转换时转换失败   varchar值'+ @ buildingIDs +'到数据类型int。

@"SELECT id, startDateTime, endDateTime 
    FROM tb_bookings 
   WHERE buildingID IN ('+@buildingIDs+') 
     AND startDateTime <= @fromDate";

buildingID是db中的int类型列。我是否需要将ID作为整数数组传递?

4 个答案:

答案 0 :(得分:2)

Bravax的方式有点危险。我会使用以下内容,因此您不会受到SQL注入的攻击:

int[] buildingIDs = new int[] { 1, 2, 3 };

/***/ @"SELECT id, startDateTime, endDateTime From tb_bookings WHERE buildingID IN (" +
      string.Join(", ", buildingIDs.Select(id => id.ToString()).ToArray())
      + ") AND startDateTime <= @fromDate"; 

答案 1 :(得分:1)

请注意,LINQ可以通过Contains(映射到IN)执行此操作。使用常规TSQL,另一种选择是将列表作为CSV(etc)varchar传递,并使用表值UDF将varchar拆分为多个部分。这允许您使用单个TSQL查询(对UDF结果执行INNER JOIN)。

答案 2 :(得分:0)

如果可能的话,我宁愿建议去存储过程,并将ID列表作为xml传递。您可以从 here 获取有关此方法的更多详细信息。

答案 3 :(得分:-1)

它试图将int与字符串值'+ @ buildingsIDs +'进行比较 因此它尝试转换字符串以将其转换为int并失败。

请执行以下操作:
buildingsIDs = "1, 5, 6";
@"SELECT id, startDateTime, endDateTime From tb_bookings WHERE buildingID IN (" + buildingIDs + ") AND startDateTime <= @fromDate";