【问题标题】:MySql.Data error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to useMySql.Data 错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用
【发布时间】:2014-11-17 09:56:56
【问题描述】:

以下代码:

string query = "INSERT INTO `@tableName` (@tableKeys) VALUES(@tableValues)";

MySqlCommand sql = new MySqlCommand(query);
sql.Connection = connection;
sql.Parameters.Add(new MySqlParameter("@tableName", values[0]));
sql.Parameters.Add(new MySqlParameter("@tableKeys", values[1]));
sql.Parameters.Add(new MySqlParameter("@tableValues", values[2]));
sql.ExecuteNonQuery();

返回错误:

MySql.Data.dll 中出现“MySql.Data.MySqlClient.MySqlException”类型的未处理异常

附加信息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''porto,date') VALUES('232,17-11-2014 10:48:11')' 附近使用正确的语法

我使用这个调用代码:

string[] values = {"logs","porto,date",num+","+date};
bool dbopen = dbManager.OpenConnection();
if(dbopen){
   dbManager.Insert(values);
}

谁能告诉我我做错了什么?

【问题讨论】:

  • 您不能将表名作为参数。
  • 那么我怎样才能实现我在这里尝试做的事情呢?
  • Sql - tablename as variable 的可能重复项
  • INSERT INTO 'log' (porto, date) VALUES (@num, @date) 并为@num 和@date 添加2个参数。

标签: c# mysql


【解决方案1】:

不能参数化您的表名和列名。

您只能参数化您的值。您需要将表名和列名添加为 sql 查询的一部分。

您应该在将表名放入 SQL 之前对其进行非常严格的验证,或者将一组有效表名列入白名单,以避免以正常方式进行 SQL 注入攻击。

阅读The Curse and Blessings of Dynamic SQL

【讨论】:

    【解决方案2】:

    我自己用这段代码解决了这个问题:

    string query = "INSERT INTO `"+values[0]+"` VALUES("+values[2]+")";
            MySqlCommand sql = new MySqlCommand(query);
            sql.Connection = connection;
            sql.ExecuteNonQuery();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2021-12-19
      • 2019-03-25
      相关资源
      最近更新 更多