我花了两天时间试图解决这个问题,但仍然无法解决代码的问题。因此,每当我尝试更新Resultset中的Date并在获得此语法异常后更新行。这一切看起来都很简单,但我只是做错了什么。你能帮我解决这个痛苦吗?
public class TableTest extends JFrame {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/fishman", "root", "");
Statement stm = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stm.executeQuery("SELECT * FROM customers where id = 3 or id = 189 or id = 310 or id = 12 order by Date ");
while(rs.next()) {
Date date = rs.getDate("lastcontact");
if(date == null) {
rs.updateDate("lastcontact", new java.sql.Date(new Date().getTime()));
rs.updateRow(); // Throws exception here
}
}
rs.close();
connection.close();
}
}
这是我得到的例外
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
at com.mysql.jdbc.UpdatableResultSet.updateRow(UpdatableResultSet.java:2411)
at com.TableTest.main(TableTest.java:50)
答案 0 :(得分:1)
可能是这样:
“使用ResultSet.updateRow将设置表格的PK(在 生成UPDATE语句)即使PK字段不在列表中 要更新的字段。如果权限没有,则会导致问题 允许用户更新表格中的某些字段(例如PK)。“
来自https://bugs.mysql.com/bug.php?id=71143
从进一步的研究中,这基本上看起来像是一个MySQL bug,它被发现但从未修复过......
解决它的一种方法可能是首先不将PK提取到resultSet中
(例如,而不是
"SELECT * FROM tbl"
其中col1是PK,do
"SELECT col2, col3..."
等)
该解决方法有一个明显的缺点 - 您没有在您的resultSet中使用PK列。
但是在你的情况下可能会有效 - 如果“lastcontact”不是你的PK(可能不是),你可以改变
SELECT * FROM customers where...
到
SELECT lastcontact FROM customers where...
这可能会奏效。
希望这会有所帮助。