Java ResultSet.updateRow()抛出MySQLSyntaxErrorException

时间:2014-08-11 20:11:18

标签: java mysql sql jdbc

我花了两天时间试图解决这个问题,但仍然无法解决代码的问题。因此,每当我尝试更新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)

1 个答案:

答案 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...

这可能会奏效。

希望这会有所帮助。