Java 错误com.ibm.db2.jcc.am.SqlException:[jcc][t4][10120][10898][3.64.82]无效操作:结果集已关闭。ERRORCODE=-4470,SQLSTATE=null

Java 错误com.ibm.db2.jcc.am.SqlException:[jcc][t4][10120][10898][3.64.82]无效操作:结果集已关闭。ERRORCODE=-4470,SQLSTATE=null,java,jdbc,db2,Java,Jdbc,Db2,您好,我只有在DB2中遇到这个问题,我使用普通jdbc执行一个简单的查询。 然后我获取结果集,在获取结果集的过程中,我调用另一个方法,该方法反过来执行另一个查询(打开和关闭另一个结果集)。 当控件返回给调用方时,我的原始结果集关闭,这真的很奇怪。 PS:我在下面发布的代码可以正确地用于Sql Server,甚至可以用于DB2 express,但是在客户机环境(DB2 on Z/OS)中,驱动程序版本为3.64.82 no //其他方法 private static String getU

您好,我只有在DB2中遇到这个问题,我使用普通jdbc执行一个简单的查询。
然后我获取结果集,在获取结果集的过程中,我调用另一个方法,该方法反过来执行另一个查询(打开和关闭另一个结果集)。 当控件返回给调用方时,我的原始结果集关闭,这真的很奇怪。
PS:我在下面发布的代码可以正确地用于Sql Server,甚至可以用于DB2 express,但是在客户机环境(DB2 on Z/OS)中,驱动程序版本为3.64.82 no

//其他方法

    private static String getUlterioreSpecifica(Connection conn, int int1) throws Exception{

    String query="select ult_desc from specifica where id=?";
    String retVal="";
      PreparedStatement pst=conn.prepareStatement(query);
      pst.setInt(1, int1);
      ResultSet rs=pst.executeQuery();
      while(rs.next()){
          retVal=rs.getString(1);
      }
      rs.close();
      pst.close();
    return retVal;
}

您可能正在自动提交模式下工作,这个特定驱动程序的默认行为可能是在提交时关闭结果集

因此,根据


您需要做的是设置
ResultSet。当您创建语句时,在提交上按住光标。

您可能正在自动提交模式下工作,此特定驱动程序的默认行为可能是在提交时关闭结果集

因此,根据



您需要做的是设置
ResultSet。在创建语句时按住光标,然后按住提交。

sql server标记是针对Microsoft sql server的,用它标记DB2问题是没有意义的。您是否禁用了连接上的自动提交?不,我不明白如果我只执行一个简单的查询,为什么必须禁用自动提交(选择)。你能解释一下吗?多谢了。刚刚由kjaklik发布的答案解释了这一点。你不必禁用自动提交,但司机的行为会受到它的影响(特别是当许多驱动程序在提交时关闭游标,并且JDBC要求在自动提交中执行新语句时,将自动提交以前的事务)sql server标记是针对Microsoft sql server的,用它标记DB2问题毫无意义。您是否已禁用连接上的自动提交?否,我不明白如果我只执行一个简单查询(选择),为什么必须禁用自动提交。您能解释一下吗?非常感谢kjaklik刚刚发布的答案解释了这一点。您不必禁用自动提交,但驱动程序的行为会受到它的影响(特别是当许多驱动程序在提交时关闭光标,JDBC要求在自动提交中执行新语句时,会自动提交以前的事务)您好,我会尽快尝试。还有一个问题,我在示例中看到我必须像这样声明外部语句:语句st1=con.createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读,ResultSet.HOLD\u游标\u OVER\u提交);然后是这样的内部语句:语句st2=con.createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读);是否正确?我的意思是,据您所知,将驱动程序版本升级到较新版本可以解决我的问题?外部语句需要有
ResultSet。按住光标/u OVER\u COMMIT
。可以创建不带任何标志的内部语句。更新驱动程序可能会有所帮助,但这不是驱动程序中的错误,而是有效的行为,例如增加性能或减少数据库过热谢谢,但我也必须禁用自动提交,对吗?不,您要么禁用自动提交,要么添加此标志谢谢,我会让您知道何时可以在客户端环境上测试它!嗨,我会尽快尝试。还有一个问题,我在示例中看到,我必须声明外部状态语句st1=con.createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读,ResultSet.HOLD\u CURSORS\u OVER\u COMMIT);然后是内部语句st2=con.createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读);是否正确?我的意思是,据您所知,将驱动程序版本升级到较新版本可以解决我的问题?外部语句需要有
ResultSet。按住光标/u OVER\u COMMIT
。可以创建不带任何标志的内部语句。更新驱动程序可能会有所帮助,但这不是驱动程序中的错误,而是有效的行为,例如增加性能或降低数据库开销谢谢,但我也必须禁用自动提交,对吗?不,您要么禁用自动提交,要么添加此标志谢谢,我会让您知道何时可以在客户端环境中测试它!
    private static String getUlterioreSpecifica(Connection conn, int int1) throws Exception{

    String query="select ult_desc from specifica where id=?";
    String retVal="";
      PreparedStatement pst=conn.prepareStatement(query);
      pst.setInt(1, int1);
      ResultSet rs=pst.executeQuery();
      while(rs.next()){
          retVal=rs.getString(1);
      }
      rs.close();
      pst.close();
    return retVal;
}