c# - MySQL truncate 命令带参数不起作用

标签 c# mysql mysql-connector

为什么在尝试截断 MySQL 表(使用 MySQL Connector/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): You have an error in your SQ L syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test'' at line 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 注入(inject)攻击

关于c# - MySQL truncate 命令带参数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401438/

相关文章:

mysql - 具有值的假列 mysql

c# - 更新多个字段

c# - 如何避免 MySql/net 连接器中的 "There is already an open DataReader associated with this Connection which must be closed first."?

c++ - MySQL 错误 2005(使用 MySql C++ 连接器):

c# - 访问 S3FileInfo 属性时发生 AmazonS3Exception

c# - 从选定的数据绑定(bind)列表框项中获取值

c# - 获取未知类型列表的计数

具有具体实现的 C# 泛型

mysql - 根据现有数据插入/更新mysql列

php - MySQL计数结果