2010-06-16 3 views
2

j'ai une procédure stockée dans SQL Server 2005, qui ressemble à ce qui suit (simplifié)NullPointerException avec CallableStatement.getResultSet()

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 

Quand je lance ce proc de SQL Server Management Studio, les choses fonctionnent bien. Cependant, quand je l'appelle le même proc à partir d'un programme Java, en utilisant quelque chose comme:

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

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

Je ne comprends pas pourquoi le premier jeu de résultat retourné est NULL. Quelqu'un peut m'expliquer cela? Pour contourner le problème, si je vérifie cs.getMoreResults() et si vrai, essayez un autre getResultSet() - CETTE fois il renvoie le jeu de résultats approprié.

Des pointeurs s'il vous plait? (J'utilise les pilotes de JTDS, si elle importe)

Merci, Raj

+0

Umm. Avez-vous appelé 'cs.execute()' ou 'cs.executeQuery()' à un moment donné? – msandiford

Répondre

2

Le Javadoc pour getResultSet() dit qu'il retourne null » ... si le résultat est un nombre de mise à jour ou il n'y a pas d'autres résultats ". Il semble que votre procédure stockée ait un nombre de mises à jour et un ensemble de résultats, et que la méthode getResultSet() fasse (sans doute) juste ce que le contrat d'API dit qu'il devrait faire.

Vous pouvez essayer de récupérer le compte de mise à jour en premier. Sinon, respectez votre "solution de contournement".

+0

Oui. Aussi une chose que j'ai remarquée est que "executeQuery()" semble fonctionner tout le temps (ne retourne jamais null). Accepter votre réponse de toute façon ... – ragebiswas

+0

@Raj - probablement si vous exécutez en utilisant executeQuery il n'y a aucun moyen de récupérer le nombre de mises à jour. (Question - le compte de mise à jour de l'INSERT est-il réellement récupérable?) –

2

Type d'affichage inutile d'une réponse après que la réponse correcte a été sélectionnée, je suppose.

La solution que je suggère appelle

set nocount on 

avant l'instruction d'insertion et

set nocount off 

après. Les insertions renvoient un résultat autrement.

Questions connexes