我正在尝试将新记录插入到MS SQL数据库中,并且我得到了一个我以前从未见过的异常.当我调用时executeUpdate抛出以下异常:
com.microsoft.sqlserver.jdbc.SQLServerException: A result set was generated for update.
这是产生错误的Java代码:
// addComment method adds a new comment for a given requestId
public CommentBean addComment(CommentBean comment) {
PreparedStatement stmt = null;
INative nat = null;
Connection conn = null;
try {
nat = dbConn.retrieveNative();
conn = (Connection)nat.getNative("java.sql.Connection");
stmt = conn.prepareStatement(ADD_COMMENT);
stmt.setInt(1, comment.getRequestId());
stmt.setString(2, comment.getComment());
stmt.setString(3, new SimpleDateFormat("MM/dd/yyyy").format(comment.getDateCreated()));
stmt.setString(4, comment.getCreatedBy());
comment.setCommentId(stmt.executeUpdate()); // exception
} catch(Exception ex) {
System.err.println("ProjectRegistration::SQLDAO - addComment");
ex.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
} catch (Exception e) {}
}
return comment;
}// end addComment
Run Code Online (Sandbox Code Playgroud)
其中ADD_COMMENT被定义为String:
private static final String ADD_COMMENT = "INSERT INTO RequestComments OUTPUT INSERTED.commentId VALUES(?,?,?,?)";
为了彻底,表格定义为:
CREATE TABLE RequestComments (
commentId int NOT NULL PRIMARY KEY IDENTITY(1,1),
requestId int FOREIGN KEY REFERENCES Requests(requestId),
comment varchar(400),
dateCreated date,
createdBy varchar(12)
);
Run Code Online (Sandbox Code Playgroud)
我不认为我在这里做任何非常复杂的事情,但我想不出为什么我会得到这个例外.我在同一个类中有一个方法,它执行完全相同的插入类型(字面上相同的查询具有不同的表名和值的数量),并且它没有问题.有没有人对如何解决这个问题有任何想法?
该指令stmt.executeUpdate()不返回commentId,它返回一个ResultSet,然后您可以从中获取commentId.像这样的东西,
ResultSet rs = stmt.executeQuery(); // Not update, you're returning a ResultSet.
if (rs.next()) {
comment.setCommentId(rs.getInt(1));
}
Run Code Online (Sandbox Code Playgroud)
此特定错误也可能由INSERT触发器引起,该触发器具有SELECT语句作为触发器代码的一部分.
要测试是否是这种情况,您可以尝试:
executeQuery(),而不是executeUpdate()- 并显示结果.我希望这可以帮助其他人查看同样的错误消息,就像它对我一样.我的解决方案是接听电话executeQuery(),虽然它只处理一个潜在的问题,而不是修复它.
| 归档时间: |
|
| 查看次数: |
16885 次 |
| 最近记录: |