2016-04-27 54 views
-1

剛發現一些奇怪的事情, 如果我寫的SQL語句的命令,像這樣:SQL UPDATE命令不會Command.Parameters.Add/AddWithValue工作

command.CommandText = "UPDATE LoginTbl SET PW = @pw WHERE TwyID = @twyID"; 
command.Parameters.AddWithValue("@pw", pw_txt.Text); 
command.Parameters.AddWithValue("@twyID", TwyID.ToString()); 
command.ExecuteNonQuery(); 

的SQL命令將不會運行拋出異常,但它根本不更新數據庫。 奇怪的是,如果我寫的不帶參數的命令:

command.CommandText = "UPDATE LoginTbl SET PW = '"+pw_txt.Text+ "' WHERE TwyID = '"+TwyID.ToString()+"'"; 
command.ExecuteNonQuery(); 

的SQL命令運行完美,但這個時候,它實際上更新數據庫!

這讓我很困惑,因爲我非常習慣在大多數SQL命令中使用參數。

想知道是否有人知道爲什麼UPDATE語句特別不接受OleDbParameters枚舉器。

感謝, 利亞姆

+0

無論什麼原因,我討厭以非標準方法解決問題;出於各種安全原因,您不應該使用像這樣的SQL查詢; – techspider

+0

人們,我知道我不應該像第二個例子那樣使用SQL查詢,我只是給出了一個有用的例子。我通常總是爲我的命令添加參數,但是在這個問題中,我簡要介紹了你不能出於某種原因而想知道爲什麼! @techspider – LiamT98

回答

1

首先,你真的不希望使用第二種方法(字符串連接),因爲它可以導致SQL注入污穢的種種以及涉及參數問題錯誤地傳遞。

如果您使用的是OleDbConnectionOleDbCommand,而不是一個SqlConnectionSqlCommand,你可能要try not using named parameters as they are not supported

的OLE DB .NET提供程序不支持命名參數傳遞 參數的SQL語句或在CommandType設置爲Text時通過 OleDbCommand調用的存儲過程。在這種情況下, 問號(?)佔位符必須使用

,而是隻使用?代替。只要確保以正確的順序添加參數:

command.CommandText = "UPDATE LoginTbl SET PW = ? WHERE TwyID = ?"; 
command.Parameters.AddWithValue("@pw", pw_txt.Text); 
command.Parameters.AddWithValue("@twyID", TwyID.ToString()); 
command.ExecuteNonQuery(); 
+0

謝謝你的答案!我知道我不應該像第二個例子中那樣使用SQL語句,我只是想舉一個例子說明它爲什麼起作用以及爲什麼以我正常的方式添加參數不起作用!我一直使用命名參數與OleDbCommands,他們往往總是工作而不是在這種情況下!再次感謝您的答案! @Rion威廉姆斯 – LiamT98