2012-02-16 118 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

相关问题