【问题标题】:java.sql.SQLException: Invalid state, the ResultSet object is closedjava.sql.SQLException: 无效状态,ResultSet 对象已关闭
【发布时间】:2011-06-19 09:25:00
【问题描述】:

我正在尝试使用 jtds 运行 StoredProcedure。 我的数据库在 SQL SErver 2008 上

private String DRIVER_NAME_VALUE = "net.sourceforge.jtds.jdbc.Driver";  
private String URL_VALUE = "jdbc:jtds:sqlserver://"; 
...
cstmt =dbConnection.getCallableStatement("{? = call dbo.GetAgentStats (?)}");
.
.
.
rs = cstmt.executeQuery();

当试图检查结果集时,我得到了异常:

java.sql.SQLException: Invalid state, the ResultSet object is closed.
        at net.sourceforge.jtds.jdbc.JtdsResultSet.checkOpen(JtdsResultSet.java:299)
        at net.sourceforge.jtds.jdbc.JtdsResultSet.first(JtdsResultSet.java:527)
        at com.verint.impact360.WFM_plugins.CCE.CCEASCMAdapter.runReport(CCEASCMAdapter.java:238)
        at com.verint.impact360.WFM_plugins.CCE.CCEASCMAdapter.retrieveData(CCEASCMAdapter.java:131)
        at com.bluepumpkin.Plugins.PTeXtender.GenericDCSPlugin.retrieveStatisticsData(GenericDCSPlugin.java:332)
        at com.bluepumpkin.Plugins.PTeXtender.GenericDCSPlugin.start(GenericDCSPlugin.java:68)
        at com.verint.impact360.WFM_plugins.CCE.CCEASCMAdapter.main(CCEASCMAdapter.java:75)
Logger.logStackTrace():----- End Stack Trace   ------

它与 SQL Server 2008 有关吗? 我不确定,但连接到 SQL Server 2005 时没有出现此错误。

谢谢

【问题讨论】:

    标签: java sql-server stored-procedures jdbc resultset


    【解决方案1】:

    只有在 ResultSet、Statement 和/或 Connection 上调用 close() 时,您才能迭代尚未关闭的 ResultSet。

    如果您的实际意图是将ResultSet 的内容传递到创建它的方法的范围之外,那么您应该首先将其映射到List<SomeObject>,然后将其返回。或者,如果您的实际意图是将其传递给其他需要 ResultSet 作为参数的类/方法(这本身就是一个糟糕的设计,但除此之外),那么您应该在相同的 @987654329 内执行此操作@ 块,因为 ResultSet 已创建。

    【讨论】:

    • 谢谢,这里不是这种情况,我想在runnng executeQuery之后直接过一遍。
    • 如果这种情况发生在 try 块中,则说明 JDBC 驱动程序中存在错误,或者代码设计中存在严重错误,例如将 ResultSet 声明为类变量而不是本地方法变量 (因此在所有线程之间共享)。尝试调查 JDBC 代码是否按照正常的 JDBC 惯用语编写。
    • @BalusC 为什么说将 ResultSet 作为参数传递是一个糟糕的设计?
    • @Hern:这意味着您需要保持连接打开以便能够在方法之外使用其结果集,并且在使用结果集后没有干净的方法来关闭连接。换句话说:资源泄漏。您的应用会在运行几个小时后中断。
    • @Hern:只要结果集在创建它的同一个 try 块的 finally 块中关闭就没有关系。只要之后正确关闭它,您就可以在私有方法中完美地重构结果集-> javabean 映射。
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2013-04-26
    相关资源
    最近更新 更多