2011-09-02 122 views
1

我得到這個錯誤:動態SQL查詢導致「未閉合的引號」的錯誤

Unclosed quotation mark after the character string ''.

用下面的代碼:

lSQL = "DELETE FROM tblCourses where courseCode='" + aCourseCode + "'"; 

哪裏lSQL是局部變量,aCourseCode是一個存儲值。有什麼建議麼?

+4

任何機會aCourseCode包含單引號?請使用參數化的SQL查詢來防止SQL注入。這裏有一個很好的解釋http://www.uberasp.net/getarticle.aspx?id=46。考慮一下,如果aCourseCode是字符串「x」或1 = 1「 – driis

+6

你的課程名稱可能是」Sql的漏洞的歷史記錄「 – Jimmy

回答

17

您應該總是使用參數化查詢或您的代碼容易出錯,因爲您正在收到的錯誤和SQL注入攻擊甚至更糟糕。 從來沒有在構建SQL查詢時使用字符串連接。下面是正確的方法:

using (var conn = new SqlConnection(ConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "DELETE FROM tblCourses WHERE courseCode = @courseCode"; 
    cmd.Parameters.AddWithValue("@courseCode", aCourseCode); 
    int deletedRowsCount = cmd.ExecuteNonQuery(); 
} 

這將確保即使aCourseCode變量包含了一些逃生和危險的人物,他們將得到妥善處理。

+2

+1這個查詢會做什麼更不用說這也會使任何引號'aCourseCode'變量。 – Yuck

+0

非常感謝你的幫助.... :) –

-4

一個更好的辦法來格式化字符串就是用這樣的:

lSQL = String.Format("DELETE FROM tblCourses where courseCode='{0}'", aCourseCode); 

另外,還要確保你沒有任何嵌入雙引號或單引號中的變量aCourseCode。

希望有所幫助。

+6

不,這不是一個更好的方法。它遭受與原始代碼相同的問題。 –

+0

我同意......我正在給他一種正確格式化字符串的方法,不適用於SQL操作。 – abraganza

+0

我不明白爲什麼這是downvoted。當然,最後提到的點更重要,但這仍然是一個很好的建議。 @Darin,雖然這不會解決問題,但* *可以更容易地發現缺少的引號,從而難以編寫錯誤引用的查詢。 (但是,當然,一旦你寫了一個參數化查詢,引用就會消失,在其他情況下它仍然是一種有用的技巧。) – stakx

0

您可能會在aCourseCode變量中出現單引號或雙引號。