执行sql语句时出错

时间:2015-09-05 15:22:33

标签: sql vb.net select sql-server-2012

当我尝试执行以下命令时,我收到以下输出错误。

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

其他信息:从字符串转换

  

INSERT INTO Leaves(EmpID,TotalL"键入' Double'无效。

当我通过sql management studio运行命令directry时,查询完成了它的工作!

2 个答案:

答案 0 :(得分:0)

如果您在年份数字周围加上单引号,则会将其设为字符串。但显然你的年份列是double类型。 (为什么?不应该是'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);
    ...
}

请注意,即使对于字符串参数,也不需要任何参数引号。它们使您免于转义字符串,格式化数字和日期。

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

答案 1 :(得分:0)

如果您确实需要连接SQL字符串,请使用&代替+将您的年份转换为字符串或联接

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