显示 ResultSet 中的自动编号字段时出错

Posted

技术标签:

【中文标题】显示 ResultSet 中的自动编号字段时出错【英文标题】:Error displaying the autonumber field from a ResultSet 【发布时间】:2014-08-11 16:03:24 【问题描述】:

输入的电影已成功保存到 moviesTbl 表,但是当我尝试显示自动编号字段“MovieID”时,我检索到错误。

public void updateMovies(String update, String title, java.sql.Date releaseDate, String genre) throws SQLException 
    Connection connection = dc.DatabaseConnection();
    PreparedStatement statement = connection.prepareStatement(update); //the insert statement is prepared 
    statement.setString(1, title); //each attribute is set individually
    statement.setDate(2, releaseDate);
    statement.setString(3, genre);
    statement.executeUpdate();
    statement.close();
    ResultSet ID = dc.query("Select * from moviesTbl where title = " + title + " and genre = " + genre + " and releaseDate = " + releaseDate); //a ResultSet is prepared for the ID of the movie 
    while(ID.next())  //the ResultSet is prepared for display
        int movieID = ID.getInt("MovieID");
        JOptionPane.showMessageDialog(null, "The movie's ID is " + movieID + ". Please record it on the DVD for future reference.");
    

错误:

Exception in thread "main" net.ucanaccess.jdbc.UcanaccessSQLException: user lacks privilege or object not found: HARRY
at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:462)
at movierentalstore.DatabaseConnection.query(DatabaseConnection.java:63)
at movierentalstore.QueryingTheDatabase.updateMovies(QueryingTheDatabase.java:181)
at movierentalstore.MovieRentalStore1.<init>(MovieRentalStore1.java:77)
at movierentalstore.MovieRentalStore1.main(MovieRentalStore1.java:25)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: HARRY
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:460)
      ... 4 more
      Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: HARRY
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.ExpressionColumn.checkColumnsResolved(Unknown Source)
at org.hsqldb.QueryExpression.resolve(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 7 more

Java 结果:1

【问题讨论】:

请提供错误和堆栈跟踪。我们没有神奇的水晶球来预测您的环境中发生的事情。 您的主要错误:net.ucanaccess.jdbc.UcanaccessSQLException:用户缺少权限或找不到对象:HARRY。好像您有这样的查询:SELECT* FROM HARRY。调试你的代码以检查你是否有类似的东西。 【参考方案1】:

JDBC 使用数据库引擎的功能来返回生成的密钥。 这可以防止需要针对特定​​的数据库供应商执行此操作,并且最重要的是: 即使两个人同时执行相同的数据库插入,您也会得到正确的 ID。

try (PreparedStatement stm = conn.prepareStatement(
        "INSERT INTO moviesTbl  (title, ...) VALUES(?, ? ...)")) 
    stm.setString(1, title);
    stm.setString(2, ...);
    ...
    int updateCount = stm.executeUpdate();
    if (updateCount != 0) 
        try (ResultSet genKeys = stm.getGeneratedKeys()) 
            if (genKeys.next())  // At most 1 record inserted
                // Normally only one key generated per record.
                int id = genKeys.getInt(0);
                ...
            
         // Close result set.
    
 // Closes stm

这有点冗长,但理论上你可以有一些包含多条记录的语句,并且每条记录有超过 1 个生成的密钥。

错误可能源于字符串常量不在撇号 (') 之间的 SELECT。 也应该是 PreparedStatement。

【讨论】:

确实我错过了撇号,当我添加它们时它确实工作得更多。但是,我知道 getGeneratedKeys() 方法是检索主键的更好方法(因为它完全唯一地标识了该字段)。虽然,当我尝试它时,我添加了一个 println 来显示密钥,没有发生错误,但是没有显示密钥。有什么建议吗? @Yohi 也将PreparedStatements 用于您的SELECT 查询。可能dc 的类提供了一种方法,它可以执行查询并以数组或类似的方式传递参数。 检查updateCount 是否确实不为零。那么genKeys.next()是否成立;可能只是 java MS Access 驱动程序无法实现该功能。由于 MS Access 并不是一个真正好的数据库,也许你可以切换到 h2 数据库左右。

以上是关于显示 ResultSet 中的自动编号字段时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 ResultSet 中是不是存在字段?

使用 angular.js 按自动编号字段删除记录

创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段

使用 ResultSet 呈现数据时出错

尝试将自动完成字段添加到AuthUserGroupsAdmin时出错

word公式交叉引用打印时出错