当前位置: 首页 > 面试题库 >

SQLServerException:生成了要更新的结果集

鄂曦之
2023-03-14
问题内容

我正在尝试将新记录插入MS SQL数据库,并且遇到了从未见过的异常​​。当我打电话时executeUpdate,抛出以下异常:

com.microsoft.sqlserver.jdbc.SQLServerException: A result set was generatedfor 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

其中ADD_COMMENT定义为字符串:

private static final String ADD_COMMENT = "INSERT INTO RequestComments OUTPUTINSERTED.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)
);

我认为我在这里没有做任何非常复杂的事情,但我无法想到为什么会遇到这种例外情况。我在同一个类中有一个方法,该方法执行完全相同的插入类型(实际上是具有不同表名和值数量的相同查询),并且没有问题。是否有人对如何解决此问题有任何想法?


问题答案:

该指令stmt.executeUpdate()不返回commentId,而是返回ResultSet,然后可以从中获取commentId。像这样

ResultSet rs = stmt.executeQuery(); // Not update, you're returning a ResultSet.
if (rs.next()) {
  comment.setCommentId(rs.getInt(1));
}


 类似资料:
  • 有几种不同方法可以生成查询结果: 结果数组 结果行 自定义结果对象 结果辅助方法 Class Reference 结果数组 result() 方法 该方法以**对象数组**形式返回查询结果,如果查询失败返回**空数组**。 一般情况下,你会像下面这样在一个 foreach 循环中使用它: $query = $this->db->query("YOUR QUERY"); foreach ($que

  • 问题内容: 我想将结果集转换为JSP页面中的列表。并希望显示所有值。这是我的查询: 我已经执行,使用 PreparedStatement的 ,并得到了 结果集 。但是如何将其转换为 列表 并希望显示如下结果: 问题答案: 您需要在循环中逐行遍历 ResultSet 对象,以提取每个列值:

  • 问题内容: 我想更改一个主键和所有引用此值的表行。 如果我提供脚本或功能 我想创建一个SQL代码段,该代码段在引用表“ master”的所有表上执行更新: 在自省的帮助下,这应该是可能的。 我使用postgres。 更新 问题是,有许多表具有表“ master”的外键。我想要一种自动更新所有具有主表外键的表的方法。 问题答案: 如果您需要更改PK,可以使用: SET CONSTRAINTS设置当前

  • 我用这个房间已经有一段时间了。我来自mysql的背景,您必须检查查询和其他内容的值。在room中,我发现这有点复杂,因为到目前为止,我可以将dao insert查询声明为void,或者只要返回rowId,如果返回long,我就必须编写一个侦听器来通知UI成功/失败。我的问题是,这是否必要?我是否需要insert/updates/deletes的返回值,或者这些查询是否保证成功?

  • 我已经在一个git分支中上传了testng-results.xml,并且正在使用git存储库作为Jenkins工作的工作区。 因为我在Jenkins上运行的测试是回归测试,所以我希望TestNG报告在任何情况下都会发生变化,存在回归缺陷。我注意到Jenkins上显示的TestNG报告只是testng-results.xml文件的可读版本,即它是我工作区中testng-results.xml文件的精

  • 问题内容: 在下面的: 我知道any(…)内部是一个生成器对象。我不明白的是缺少括号-如果括号属于any()函数,在生成器表达式周围是否应该有另一组括号? 谢谢。 问题答案: 当仅在一个参数中使用函数调用时,可以省略括号,生成器表达式语法专门允许使用该括号。 仅带有一个参数的调用可以省略括号。有关详细信息,请参见“通话”部分。