2012-02-16 146 views
0

你好我得到這個錯誤 -錯誤轉換數據類型爲nvarchar爲bigint

'錯誤轉換數據類型爲nvarchar爲bigint'

同時運行這是代碼:

string idString = "1,2,3,4"; 

string updateSql = "UPDATE DistinctClubcard SET ProcessedYorN = 'Y' " + "WHERE CLUBCARD_NUMBER in (@flag) "; 

SqlCommand UpdateCmd = new SqlCommand(updateSql, cn); 
UpdateCmd.Parameters.Add(new SqlParameter("@flag", SqlDbType.NVarChar, 2000)); 
UpdateCmd.Parameters["@flag"].Value = idString ; 
UpdateCmd.ExecuteNonQuery(); 
+0

產生的SQL查詢將如下類似於('1,2,3,4')'UPDATE DistinctClubcard SET ProcessedYorN ='Y'WHUB CLUBCARD_NUMBER,注意數字周圍的引號。 – Matthew 2012-02-16 18:15:20

回答

5

這是行不通的 - 一個SQL IN (...)查詢需要一個數組的sql參數,它不會只用pa選擇一個字符串參數。而是使用每個值和一個單獨的參數整數值數組:

string idString = "1,2,3,4"; 
var ids = idString.Split(',').Select(x => int.Parse(x)).ToArray(); 

for(int i =0;i< ids.Length;i++) 
{ 
    UpdateCmd.Parameters.Add(new SqlParameter("@flag"+i, SqlDbType.BigInt)); 
    UpdateCmd.Parameters["@flag"+i].Value = ids[i]; 
} 

當然,這也改變了你的查詢,你必須考慮到您的參數中:

string flags = string.Join(",", ids.Select((s, i) => "@flag" + i)); 
string updateSql = string.Format("UPDATE DistinctClubcard SET ProcessedYorN = 'Y' WHERE CLUBCARD_NUMBER in ({0})",flags); 
+0

+1在編輯後更改查詢以匹配參數列表。 – 2012-02-16 18:41:10

0

參數是要作爲單個值傳遞給SQL Server,而不是作爲查詢中的替換。有多種方法可以發送多個值,包括(對於SQL Server 2008)表值參數,或可能將參數格式化爲XML,以便在SQL Server端進行分析。 (我用這個解決方案一次,但我不會推薦它,除非你不能找到另一種解決方案。)

進行更深入的答案,查看所以這個問題:Passing List<> to SQL Stored Procedure

相關問題