2013-07-01 112 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

这是很常见的方式^^ –