2012-09-03 26 views
3

我在編程時有點兒不自在,我在想我在這裏做了什麼錯誤 - 有人能幫我嗎?'s'附近的語法不正確。在字符串'''後沒有使用引號'

我正在製作一個控制檯應用程序,它將兩個數據庫同步,但是當我嘗試將數據插入到表中時,它會引發此異常;該代碼是:

public static void AddInterationPath(SqlConnection conDS_ReleaseCri, DataRow dr) 
{ 
    SqlCommand insertNewAreaPath = new SqlCommand("INSERT INTO InterationPath (ID,NodePath) VALUES(" + dr[0].ToString() + ",'" + dr[2].ToString() + "')", conDS_ReleaseCriterions); 
    insertNewAreaPath.ExecuteNonQuery(); 
} 

public static void AddAreaPath(SqlConnection conDS_ReleaseCri, DataRow dr) 
{ 
    SqlCommand insertNewAreaPath = new SqlCommand("INSERT INTO AreaPath (ID,NodePath) VALUES(" + dr[0].ToString() + ",'" + dr[2].ToString() + "')", conDS_ReleaseCriterions); 
    insertNewAreaPath.ExecuteNonQuery(); 
} 

而且我得到以下異常:

不正確的語法近的。「在字符後面沒有顯示的引號 string')'

+0

也許'dr [2]'包含引號?你必須避免引號(在TSQL中簡單地加倍所有單引號) – rabudde

+3

這種代碼很容易被SQL注入。使用[參數化查詢](http://www.dotnetperls.com/sqlparameter)或一個ORM(如LINQ to SQL)來處理轉義參數。 – Adam

+1

更好的解決方案是使用[SQL Transaction](http://www.codeproject.com/Articles/10223/Using-Transactions-in-ADO-NET)和[參數化查詢](http:// www。 dotnetperls.com/sqlparameter)。這將保護您,並允許您一次執行多個查詢,而不會產生巨大的開銷。 – TheGeekZn

回答

10

您插入的數據可能包含特殊字符,如單引號。更改爲參數化查詢,以便正確轉義值。一個很好的例子和解釋是http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html

[編輯:添加了一個例子。 ]

例如,更換你的第一個函數的內容:

SqlCommand insertNewAreaPath = new SqlCommand(
    "INSERT INTO InterationPath (ID, NodePath) VALUES(@ID, @NodePath)",  
    conDS_ReleaseCriterions); 
insertNewAreaPath.Parameters.Add("@ID", dr[0]); 
insertNewAreaPath.Parameters.Add("@NodePath", dr[2]); 
insertNewAreaPath.ExecuteNonQuery(); 
+1

+1是唯一正確答案的問題。一個內聯樣本可能會有所幫助,因爲你永遠不知道鏈接有多長時間有效。 – Lucero

+0

@Lucero好主意。感謝您的建議。 – akton

+0

非常感謝各位,它真的幫了我特別是akton的例子:) –

0

如果你有「「」的內部字符串,則該類型錯誤的是正在添加的價值,所以刪除字符串「」」然後執行查詢。

+0

比不按原樣複製數據,是嗎? – Lucero

+1

這種方法是非常錯誤的。它不僅限制了要寫入數據庫的數據,而且它仍然使SQL查詢容易出現更多錯誤。你會使用查詢參數。 – quetzalcoatl

+0

非常感謝,我會嘗試改變方法。 –

相關問題