我正在尝试调用下面的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作为整数数组传递?
答案 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";