2015-09-05 153 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)