显示 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 也将PreparedStatement
s 用于您的SELECT
查询。可能dc
的类提供了一种方法,它可以执行查询并以数组或类似的方式传递参数。
检查updateCount
是否确实不为零。那么genKeys.next()
是否成立;可能只是 java MS Access 驱动程序无法实现该功能。由于 MS Access 并不是一个真正好的数据库,也许你可以切换到 h2 数据库左右。以上是关于显示 ResultSet 中的自动编号字段时出错的主要内容,如果未能解决你的问题,请参考以下文章
创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段