2008-12-17 39 views
7

我遇到了允許將字符串或NULL傳遞到數據庫的適當語法時遇到問題。這裏是我的代碼:將字符串或NULL插入到SQL Server數據庫時出現問題

string insertString = String.Format(
    @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES ('{0}', '{1}', '{2}')", 
    varField1, varField2, varField3); 

我用周圍的變量佔位符單引號,這樣的數據庫將適當接受字符串值。但是,如果傳遞NULL,它將以字符串「NULL」的形式進入數據庫。

有沒有辦法讓單引號離開InsertCommand字符串並有條件地向我的變量添加單引號?

回答

22

不要將字符串(string.Format) - 使用參數(@p1等) - 那麼你可以傳遞DBNull.Value意味着空到SQL Server

SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", (object)someVar ?? DBNull.Value); 
//... 

這也保護您免受SQL注入

+0

使用「someVar ?? DBNull.Value」當我得到以下錯誤,如上面:「操作「 ??」不能應用於類型爲string和System.DBNull的操作數「有關如何使用字符串的任何想法? – buzzzzjay 2011-11-03 14:48:49

+2

@buzzzzjay在其中任何一個前面添加一個「(對象)」。 – 2011-11-03 14:51:48

5

用String.Format集中字符串可能會帶來很大的安全風險(SQL注入),並且如果要插入「字符」,也會出現問題。

解決方案:

cmd.CommandText = "INSERT INTO upload_history (field1, field2, field3) " + 
    "VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", varField1); 
cmd.Parameters.AddWithValue("@p2", varField2); 
cmd.Parameters.AddWithValue("@p3", varField3); 
cmd.ExecuteNonQuery(); 
2

在回答這個問題,因爲它是問,是充分認識到重構的代碼paramaterizing查詢是正確的解決辦法的精神,你可以寫一個返回無論是功能單引號字符串或非引號NULL字符串值,然後從查詢字符串中刪除單引號。

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3)); 

如果你正在使用VS 2008,你甚至可以實現它作爲一個擴展方法。

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", varField1.ToStringorNull, varField2.ToStringorNull, varField3.ToStringorNull); 

我將離開創建ToStringorNull功能給你 - 這是不難:-)

相關問題