NullPointerException с CallableStatement.getResultSet () - PullRequest
2 голосов
/ 16 июня 2010

У меня есть сохраненный процесс в SQL Server 2005, который выглядит следующим образом (упрощенно)

CREATE PROCEDURE FOO
 @PARAMS
AS
BEGIN
  -- STEP 1: POPULATE tmp_table
  DECLARE @tmp_table TABLE (...)
  INSERT INTO @tmp_table
      SELECT * FROM BAR

  -- STEP 2: USE @tmp_table FOR FINAL SELECT
  SELECT abc, pqr
    FROM BAZ JOIN @tmp_table 
    ON some_criteria
END

Когда я запускаю этот процесс из SQL Server Management Studio, все работает нормально. Однако, когда я вызываю тот же процесс из Java-программы, использую что-то вроде:

cs = connection.prepareCall("exec proc ?,");
cs.setParam(...);
rs = cs.getResultSet(); // BOOM - Null!

while(rs.next()) {...} // NPE!

Я не понимаю, почему первый возвращенный набор результатов равен NULL. Может кто-нибудь объяснить мне это?

В качестве обходного пути, если я проверю cs.getMoreResults () и если true, попробуйте другой метод getResultSet () - на этот раз он вернет правильный набор результатов.

Любые указатели, пожалуйста? (Я использую драйверы JTDS, если это имеет значение)

Спасибо, Радж

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Вид бессмысленного размещения ответа после выбора правильного ответа, я думаю.

Предлагаемое мной решение - это вызов

set nocount on

перед оператором вставки и

* 1007.*

потом.В противном случае вставки возвращают набор результатов.

2 голосов
/ 16 июня 2010

Javadoc для getResultSet() говорит, что он возвращает ноль "... если результатом является количество обновлений или результатов больше нет". Похоже, что ваша хранимая процедура будет иметь количество обновлений и набора результатов, и что метод getResultSet() (возможно) просто выполняет то, что согласно контракту API должно быть сделано.

Вы можете сначала попытаться получить счетчик обновлений. В противном случае придерживайтесь своего «обходного пути».

...