参数为的MySQL截断命令不起作用
本文关键字:命令 不起作用 MySQL 参数 | 更新日期: 2023-09-27 18:20:37
为什么在尝试截断MySQL表(使用MySQL连接器/Net)时会出现异常?我正试图给表名加一个参数。
这是我正在执行的代码:
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());
}
这就是执行:
MySql.Data.MySqlClient.MySqlException(0x80004005):您有一个错误在您的SQ L语法中;查看与MySQL对应的手册在第1行的"测试"附近使用正确语法的服务器版本
例如,当我尝试选择查询时,我不会有任何问题。这运行良好并返回正确的数据:
conn.Open();
const string sql = "SELECT body FROM test WHERE id=@pid";
var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@pid", 1);
cmd.ExecuteScalar();
conn.Close();
参数用于查询值,而不是表之类的对象名称。
因此,这肯定不会奏效。
您需要使用字符串串联在命令字符串中设置表名。您可以通过手动检查表名中的奇怪字符(空格、破折号、分号等)来避免sql注入攻击。
我已经玩了一段时间了,似乎也无法让它发挥作用。我在网上找不到任何文档,所以我开始认为您可能无法像尝试过的那样使用参数进行截断。
但是,是否真的需要防止对该命令进行SQL注入?用户是否输入了要截断的表的名称,如果是,他们只会截断一个表。。。本质上是命令的作用?