0

为什么在尝试截断 MySQL 表(使用 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());
}

这是例外:

MySql.Data.MySqlClient.MySqlException (0x80004005):你的 SQL 语法有错误;检查与您的 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();
4

2 回答 2

2

参数用于查询值,而不是表等对象名称。

所以这肯定行不通。

您需要使用字符串连接在命令字符串中设置表名。您可以通过手动检查表名中的奇怪字符(空格、破折号、分号等)来避免 sql 注入攻击

于 2013-07-01T10:26:38.543 回答
0

我已经玩了一段时间了,我似乎也无法让它工作。我在网上找不到任何文档,所以我开始认为您可能无法像您尝试过的那样使用参数截断。

但是,是否真的需要在此命令上防止 SQL 注入?用户是否输入了他们想要截断的表的名称,如果是这样,他们只是要截断一个表,而这实际上是命令所做的事情?

于 2013-07-01T10:21:58.560 回答