2013-07-01 34 views
0

爲什麼我在試圖截斷MySQL表時(使用MySQL Connector/Net)會出現異常?我正在試圖給一個參數的表名。MySQL截斷帶參數不起作用的命令

這是我執行的代碼:

var connectionString = "Server="+_server+";Uid="+_user+";Pwd="+_password+";Database="+_database+";"; 

try 
{ 
    using (var conn = new MySqlConnection(connectionString)) 
    { 
     conn.Open(); 
     const string sql = "TRUNCATE TABLE @tablename"; // also tried with TRUNCATE @tablename 
     var cmd = new MySqlCommand(sql, conn); 
     cmd.Parameters.AddWithValue("@tablename", "test"); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 
    } 

} 
catch (MySqlException ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 

這是execption:

MySql.Data.MySqlClient.MySqlException(0X80004005):你有一個錯誤 您SQ L語法;檢查對應於你的MySQL 服務器版本在1號線

使用近「」測試「」當我嘗試選擇查詢正確的語法手冊,例如,那麼我沒有任何問題。這運行良好,並返回正確的數據:

conn.Open(); 
const string sql = "SELECT body FROM test WHERE [email protected]"; 
var cmd = new MySqlCommand(sql, conn); 
cmd.Parameters.AddWithValue("@pid", 1); 
cmd.ExecuteScalar(); 
conn.Close(); 
+0

給出無參數的表名稱的結果是什麼? 'var cmd =「TRUNCATE TABLE test」' –

回答

2

參數用於查詢值,而不是表格等對象名稱。

所以這不會工作。

您需要使用字符串連接在命令字符串中設置表名。您可以通過手動檢查表名稱中的奇怪字符(空格,破折號,分號等)來避免SQL注入攻擊。

+0

謝謝,[這個問題](http://stackoverflow.com/questions/3128582/table-name -and-table-field-on-sqlparameter-c)似乎證實了它。 –

0

我一直在玩這一段時間了,我似乎無法得到它的工作。我在網上找不到任何文檔,所以我開始認爲你可能無法用你試過的參數截斷。

但是,是否真的需要防止SQL注入此命令?用戶是否輸入了他們想要截斷的表的名稱,如果是,他們只是要截斷一個表......這基本上是命令的作用?

+0

沒有真正的需要,我想。只是很專注於做事情的「正確的方式」,但沒有意識到:) –

+0

這是很常見的方式^^ –