从插入语句获取结果集

3

我有以下代码,用于向表中插入记录。当我尝试获取结果集时,它返回null。如何将最新添加的行添加到结果集中?

String sql1 = "INSERT INTO [xxxx].[dbo].[xxxxxx](WORKFLOW_SEQ_NBR," +
                      " WORKFLOW_LOG_TYPE_CODE, WORKFLOW_STATUS_CODE, DISP_CODE, DISP_USER, DISP_COMMENT, DISP_TITLE, DISP_TS)" +
                      "VALUES(?,?,?,?,?,?,?,?)";
        PreparedStatement pst = connect.prepareStatement(sql1);
        pst.setString(1, ...);
        pst.setString(2, ...);
        ...
        ...
        ...
        pst.executeUpdate();

        ResultSet rstest = pst.executeQuery();
//          ResultSet rstest = pst.getResultSet();

编辑:已解决

添加以下方法以跳转到最后添加的行

st.execute("Select * from [xxxx].[dbo].[xxxxxxxxx]");
        ResultSet rstest = st.getResultSet();
        rstest.afterLast();
        GETLASTINSERTED:
        while(rstest.previous()){
            System.out.println(rstest.getObject(1));
            break GETLASTINSERTED;//to read only the last row
        } 

你对插入语句期望得到什么结果? - Patrick J Abare II
你期待什么?你需要运行一个选择查询以获得一些结果。 - Deb
你无法从INSERT,UPDATE&DELETE(通过executeUpdate())操作中按预期检索结果,但可以从SELECT(FIND)(通过executeQuery())操作中检索。 - Wundwin Born
我需要使用上述pst插入的行。如何将结果集的光标移动到该行? - Le_Master
3个回答

10
使用如INSERTUPDATEDELETE等SQL语句时,必须使用PreparedStatementexecuteUpdate方法,它将返回受影响的行数。在这种情况下,SQL操作不会产生任何ResultSet,因此调用executeQuery将抛出SQLException异常。

如果实际上需要ResultSet,则必须使用SELECT SQL操作进行另一个语句。

请参见PreparedStatement#executeQueryPreparedStatement#executeUpdate的javadoc文档。


将资金ID、基金名称、活动状态、注册国家、源表和源系统插入到amalgam_care表中,选择来自EMIS_FUNDS表中状态为2、3或4且活动状态为1的所有记录,并按fund_id排序 <- 我有这个查询,我想在插入后返回ID,该怎么做? - Sithija Piyuman Thewa Hettige

5
似乎这是一个较旧的问题,但我正在寻找类似的解决方案,所以也许人们仍然需要这个。如果你正在进行插入语句,可以使用Connection.PreparedStatement(String, String[])构造函数,并将其分配给一个ResultSet,并使用ps.getGeneratedKeys()获取生成的键。代码如下:
public void sqlQuery() {
    PreparedStatement ps = null;
    ResultSet rs = null;
    Connection conn; //Assume this is a properly defined Connection
    String sql = "insert whatever into whatever";
    ps = conn.prepareStatement(sql, new String[]{"example"});
        //do anything else you need to do with the preparedStatement
    ps.execute;
    rs = ps.getGeneratedKeys();
    while(rs.next()){
        //do whatever is needed with the ResultSet
    }
     ps.close();
     rs.close();
}

示例代码不应该是 select example,而应该是 String sql = "insert into..."。无论如何,很高兴知道有一个 getGeneratedKeys 方法,谢谢。 - AJPerez

1

Connection#prepareStatement() - 创建一个PreparedStatement对象,用于向数据库发送带参数的SQL语句。

这意味着connect.prepareStatement(sql1);使用您的插入查询创建了PreparedStatement对象。

当您执行pst.executeUpdate();时,它将返回SQL数据操作语言(DML)语句的行计数,或者对于不返回任何内容的SQL语句,它将返回0。

现在,如果您想再次获取插入的数据,您需要使用Select查询创建一个新的PreparedStatement对象。

    PreparedStatement pstmt = connect.prepareStatement("SELECT * FROM tableName");

然后这将为您提供包含查询生成的数据的ResultSet对象

    ResultSet rstest = pstmt.executeQuery();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接