2013-07-02 31 views
0

我怎樣才能將數據(如"John's shoe")輸入到SQL Server CE表(版本3.5)中,因爲插入語句等等不接受使用'語句中的撇號如下語句:用'(apostrophy)向SQL Server CE表輸入數據

INSERT INTO ShowsDB(Item) VALUES('+ "John's shoes" + "') 
+2

這允許SQL注入攻擊。使用參數化查詢,您將減輕攻擊**和**能夠插入單引號。 – zimdanen

回答

7

您必須避免將數據直接放入您的SQL,基本上。使用參數化的SQL來代替:

// I'm assuming you're opening the connection already 
string sql = "INSERT INTO ShowDB(ITEM) VALUES (@Name)"; 
using (var command = new SqlCommand(sql, connection)) 
{ 
    command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = "John's shoes"; 
    command.ExecuteNonQuery(); 
} 

使用參數化SQL有三個好處:

  • 避免了SQL injection attacks
  • 避免了不必要的和危險的字符串轉換(特別是日期/時間類型)
  • 分隔的「代碼「(SQL),使數據(參數)更容易理解
+0

好的,這似乎工作,但我也嘗試檢查數據是否已經存在,並且不起作用:var rows = dataTable.Select(「Item =」+「John's shoes」); if(rows.Length == 0) – touyets

+1

@ user1842134:您沒有提及使用數據表。正因爲這種事情,我並不是「DataTable.Select」的忠實粉絲。你可能最好只是遍歷行並檢查每一行。 –

0

標準SQL轉義是引號應增加一倍,所以你的查詢變得

INSERT INTO ShowsDB(Item) VALUES('+ "John''s shoes" + "') 

這是搞什麼運行鍼對數據庫的副本來診斷問題SELECT語句完全正常的,但千萬不要在實際使用生產系統。參數化查詢是你的朋友。

+0

以任何方式使用它是一個壞習慣。參數化查詢應始終在100%的時間內使用,即使您知道您的查詢是安全的還是您處於安全環境中。所需要的只是一個人將一些代碼複製/粘貼到您的項目中,而您現在很容易受到攻擊。如果你養成了所有時間參數化的習慣(這實際上比用所有引號和字符逃跑都容易得多),你永遠不會犯錯。 –