2011-02-01 3 views
1

Я пытаюсь запустить StoredProcedure с помощью jtds. Моя база данных на SQL SERVER 2008java.sql.SQLException: Неверное состояние, объект ResultSet закрыт

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? Я не уверен, но у меня не было этой ошибки, когда connectig к SQL Server 2005.

Благодарности

ответ

5

Вы можете перемещаться только по ResultSet, когда он еще не был закрыт по телефону close() на ResultSet, Statement и/или Connection.

Если ваше фактическое намерение состоит в том, чтобы передать содержимое ResultSet вне области действия метода, в котором он был создан, вы должны сначала сопоставить это с List<SomeObject>, а затем вернуть его. Или если ваше фактическое намерение - передать его другому классу/методу, который ожидает ResultSet в качестве аргумента (который по своей собственной плохой конструкции, но это в стороне), то вы должны делать это внутри того же самого блока try, что и ResultSet.

+0

Спасибо, здесь нет этой ситуации, я хочу пройти через нее сразу после запуска execQuery. – Waseem

+0

Если это происходит внутри блока try, то есть ошибка в драйвере JDBC или в дизайне кода есть что-то серьезное, например, если 'ResultSet' объявлен как переменная класса вместо локальной переменной метода (и, таким образом, будет использоваться для всех потоков). Попытайтесь выяснить, написан ли код JDBC в соответствии с обычной идиомой JDBC. – BalusC

+0

@BalusC Почему вы говорите, что это плохой дизайн для передачи ResultSet в качестве аргумента? –

Смежные вопросы