尝试从Java中将一些值插入Mysql时出现语法错误。
我的代码如下所示:
date = new SimpleDateFormat("yyyy-MM-dd").parse(nextLine[0]);
java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime());
st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES (" + sqlDate + ", " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")");
我的例外:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个 SQL语法错误;查看与您的手册相对应的手册 MySQL服务器版本,在'00:00:00.0附近使用正确的语法, 128.40,128.50,127.30,128.20,1415200)'第1行
很高兴得到任何帮助:)
答案 0 :(得分:6)
虽然可以修复即时语法错误,但我会强烈推荐它。您根本不应该直接在SQL中包含这些值。
相反,请通过PreparedStatement
使用参数化查询,并将值设置为参数。在这种情况下,您可以使用PreparedStatement.setTimestamp
来设置值 - 当然,在首先更改要参数化的查询之后。
参数化SQL的好处:
答案 1 :(得分:1)
强烈建议:
1)在调用executeUpdate()
之前创建一个Java字符串变量2)确保你的字符串语法正确(引用日期,值之间用逗号等)
ALSO:
“准备”是你的朋友;)
我认为你可能已经在使用它们......但是你没有显示那部分代码......我当然没有看到任何地方标记(“?”)< / p>
但我认为1)首先制作字符串,然后2)在JDBC调用之前检查字符串(例如在调试器中)将是一个巨大的帮助......恕我直言......
答案 2 :(得分:0)
需要在MySQL中引用日期,因此您需要使用单引号包装sqlDate
:
st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES ('" + sqlDate + "', " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")");
我假设其他值是数字,因此没有引号是安全的。
这种方法最大的问题是你容易受到SQL injection attacks的影响。您应该切换到使用预准备语句:
PreparedStatement ps = conn.prepareStatement("INSERT INTO my_table(day, open, high, low, close, volume) VALUES (?,?,?,?,?,?)");
ps.setTimestamp(1, sqlDate);
ps.setBigDecimal(2, nextLine[1]);
...