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”附近使用正确的语法 这段代码有什么问题?
答案 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)
^^^^^^^ ^
此模式修复了语法问题(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攻击中发生