在重复更新Mysql错误

时间:2015-05-15 20:37:41

标签: c# mysql asp.net

 string ip_date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

        MySqlCommand cmd = new MySqlCommand("insert into ip_table (ip_addr,ip_date) values (@ip_addr,@ip_date) ON DUPLICATE KEY UPDATE ip_hitcount = ip_hitcount + 1 , ip_date = " + ip_date, con);

        cmd.Parameters.AddWithValue("@ip_addr", ipaddress);
        cmd.Parameters.AddWithValue("@ip_date", ip_date);

        cmd.ExecuteNonQuery();
  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行'02:04:50'附近使用正确的语法说明:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:MySql.Data.MySqlClient.MySqlException:SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“02:04:50”附近使用正确的语法   这段代码有什么问题?

2 个答案:

答案 0 :(得分:1)

我建议使用特殊的VALUES函数(在INSERT ... ON DUPLICATE KEY语句的更新部分中)来引用为列提供的值。

例如:

INSERT INTO ip_table (ip_addr,ip_date) VALUES (@ip_addr,@ip_date) 
ON DUPLICATE KEY 
UPDATE ip_hitcount = ip_hitcount + 1 
     , ip_date = VALUES(ip_date)
                 ^^^^^^^       ^

参考:https://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_values

此模式修复了语法问题(SQL文本中日期文字周围缺少单引号),并且还清楚地显示(在SQL语句本身中)分配给列的值是提供的值在INSERT语句中,并未被某些其他机制设置为某些其他文字。)

演示的模式还避免了必须提供额外的绑定参数,并且(更糟糕的是)将可能不安全的值合并到SQL文本中,可能会打开SQL注入漏洞。 (使用此模式,SQL文本是 static ,它不是使用字符串连接操作动态生成的。)

答案 1 :(得分:0)

您似乎只需要将参数@ip_date用于UPDATE部分

MySqlCommand cmd = new MySqlCommand(@"insert into ip_table 
                       (ip_addr,ip_date) values 
                       (@ip_addr,@ip_date) 
                       ON DUPLICATE KEY 
                       UPDATE ip_hitcount = ip_hitcount + 1, 
                       ip_date = @ip_date", con);

虽然这可能是一个边缘情况,但是使用字符串连接来准备sql语句是确定这样的错误的方法,或者更糟糕的是在Sql Injection攻击中发生