我尝试使用如下所示的SQL语句对Oracle数据库运行插入:
INSERT INTO browsers (browsers.id,browsers.browser,browsers.engine,browsers.platform,browsers.version,browsers.grade) VALUES (BROWSERS_SEQ.NEXTVAL,?,?,?,?,?)
但是,jdbc驱动程序不断返回错误消息:
SQL问题:没有数据读取
SQL状态:02000
供应商错误:17024
java.sql.SQLException:没有数据读取
声明的执行按预期进行。但是,由于这是一个插入,我试图获取新记录的ID。
请参阅我的Java代码,我收到错误消息:
try{
connection = getConnection();
if(connectionException == false)
{
connection.setAutoCommit(false);
statement = query.getPreparedStatement(connection);
statement.executeUpdate(); //<<< This executes fine.
if(query.getQueryType() == Query.Type.INSERT)
{
//Get the id assigned to the new record
//If we are dealing with a Link Table then we don't need to retrieve any generated ids.
if(query.isLinkTable() == false)
{
resultSet = statement.getGeneratedKeys();
if(!resultSet.wasNull())//<<< This is where I'm getting the error.
{
if(resultSet.next())
{
query.setNewRecordID(resultSet.getInt(1));
//System.out.println(query.getNewRecordID());
}
else
{
if(Editor.isLoggingEnabled())
{
throw new SQLException("Database.executeInsertUpdate - on INSERT - Unable to retrieve id value");
}
}
}
resultSet.close();
resultSet = null;
}
}
connection.commit();
statement.close();
statement = null;
}
完成堆栈跟踪:
17:48:56,219 ERROR Database:882 - Database.executeInsertUpdate - query: INSERT I
NTO browsers (browsers.id,browsers.browser,browsers.engine,browsers.platform,bro
wsers.version,browsers.grade) VALUES (BROWSERS_SEQ.NEXTVAL,?,?,?,?,?)
SQL Problem: No data read
SQL State: 02000
Vendor Error: 17024
java.sql.SQLException: No data read
at oracle.jdbc.driver.OracleStatement.wasNullValue(OracleStatement.java:
4099)
at oracle.jdbc.driver.InsensitiveScrollableResultSet.wasNull(Insensitive
ScrollableResultSet.java:201)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.wasNull(DelegatingRes
ultSet.java:210)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.wasNull(DelegatingRes
ultSet.java:210)
at com.tacticalenterprisesltd.Database.executeInsertUpdate(Database.java
:841)
at com.tacticalenterprisesltd.Editor.insert(Editor.java:1922)
at com.tacticalenterprisesltd.Editor.Process(Editor.java:800)
at org.apache.jsp.jsp.browsers_jsp._jspService(browsers_jsp.java:178)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
答案 0 :(得分:1)
从代码片段中不清楚PreparedStatement
是如何创建的。我认为它隐藏在getPreparedStatement(con)
方法中。
您可能想要检查的一件事是,您是否在preparedstatement
创建中指定它应该返回生成的密钥。例如:con.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);
?如果没有,请添加并测试。
答案 1 :(得分:0)
我认为您使用preparedStmt.getResultSet()
代替preparedStmt.executeQuery()
Insert不会返回任何结果数据。如果不是这种情况,我们需要查看更多代码。