2008-10-08 32 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)。