2008-10-08 49 views
1

我试图拨打下面的SQL语句,但出现以下错误:的SqlParameter转换

System.Data.SqlClient.SqlException: Conversion failed when converting the varchar value '[email protected]+' to data type int.

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

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

+0

你可以发布一些关于如何调用的代码吗? – Darksider 2008-10-08 11:18:33

+0

这几乎完全相同?作为http://stackoverflow.com/questions/182060/sql-where-in-array-of-ids – Josef 2008-10-08 20:50:32

回答

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

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

所以,做到以下几点:
buildingsIDs = "1, 5, 6";
@"SELECT id, startDateTime, endDateTime From tb_bookings WHERE buildingID IN (" + buildingIDs + ") AND startDateTime <= @fromDate";

0

我宁愿建议去一个存储过程,如果possilble,并通过ID的列表作为XML。您可以从here中获得有关此方法的更多详细信息。

1

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