2015-09-05 77 views
-4

当我尝试执行以下命令时,出现以下输出错误。执行sql语句时出错

("INSERT INTO Leaves (EmpID,TotalLeavesRemaining,Year) 
     SELECT EmpID,TotalLeavesRemaining,'" + year + "' 
     FROM Leaves 
     WHERE Year = '" + yearbefore + "' ", con) 

其他信息:从字符串转换

INSERT INTO叶(的EmpID,TotalL”键入 '双' 无效

当我通过运行该命令直供。 sql管理工作室查询完成它的工作!

+0

标签你与你所使用的数据库问题加入。 –

+2

你需要使用不连接sql字符串的参数 - 可以让你打开sql注入攻击,并且会为你评估数据类型。 – OneFineDay

+0

Year的数据类型是什么,当你试图像字符串一样处理时,它是双倍的吗? –

回答

0

如果你把单引号放在你的年份数字中,它会使它成为一个字符串,但显然你的年份列i s型双。 (为什么?不应该是int类型的)。删除单引号!

并且还使用命令参数。这使得它更安全,不易出错并且更快,因为SQL-Server可以缓存查询并重用它,而无需重新编译并再次创建执行计划。

using (var cmd new SqlCommand(@"INSERT INTO Leaves (EmpID, TotalLeavesRemaining, Year) 
           SELECT EmpID,TotalLeavesRemaining, @year 
           FROM Leaves 
           WHERE Year = @yearbefore", con)) { 
    cmd.Parameters.AddWithValue("@year", 2015); 
    cmd.Parameters.AddWithValue("@yearbefore", 2014); 
    ... 
} 

请注意,即使对于字符串参数,您也不需要引用任何引号。他们免费逃离字符串,格式化数字和日期。

如果要使用多行字符串,请使用与@一起引入的逐字字符串。这些字符串文字可以跨越多行,并且不会将反斜杠(\)解释为转义字符。单引号可以通过双引号转义。

0

如果你真的需要连接SQL字符串,然后你的年转换为字符串或使用&代替+

("INSERT INTO Leaves (EmpID,TotalLeavesRemaining,Year) 
     SELECT EmpID,TotalLeavesRemaining,'" + year.ToString + "' 
     FROM Leaves 
     WHERE Year = '" + yearbefore.ToString + "' ", con)