La méthode executeQuery doit renvoyer un problème de jeu de résultats

J'ai un problème où j'essaie d'utiliser un sp mais je reçois un

La méthode executeQuery doit renvoyer un résultat

et si j'utilise cs.execute(); avec ResultSet rs = cs.getResultSet(); à la place je reçois un nullpointer sur if(rs.next())

 protected Ssortingng doInBackground(Ssortingng...params) { if (userid.sortingm().equals("") || password.sortingm().equals("")) z = getSsortingng(R.ssortingng.wrong_user); else { try { Connection con = connectionClass.CONN(); if (con == null) { z = getSsortingng(R.ssortingng.connection_error); } else { Ssortingng query = "{?=call [system].[usp_validateUserLogin](?,?,?,?,?)}"; CallableStatement cs = con.prepareCall(query); cs.registerOutParameter(1,Types.INTEGER); cs.setSsortingng(2, userid); cs.setSsortingng(3, password); cs.setInt(4, 72); cs.setNull(5, Types.BIT); cs.registerOutParameter(6, Types.VARCHAR); cs.execute(); boolean firstResultIsResultSet = cs.execute(); if (firstResultIsResultSet) { ResultSet rs = cs.getResultSet(); // process result set } } } if (rs.next()) { z = getSsortingng(R.ssortingng.login_succes); isSuccess = true; } else { z = getSsortingng(R.ssortingng.Invalid_Credentials); isSuccess = false; } } } catch (Exception ex) { isSuccess = false; z = getSsortingng(R.ssortingng.Exceptions); } } return z; } 

SP:

 ALTER PROCEDURE [system].[usp_validateUserLogin] @p_Login NVARCHAR ( 50 ), @p_Password NVARCHAR ( 32 ), @p_CompanyID INT, @p_OutDetails BIT = 1, @p_AuthenticationTicket VARCHAR(200) OUTPUT AS BEGIN SET NOCOUNT ON; DECLARE @errNo INT, @recCount INT, @res INT SELECT u.* INTO #TMPLOGIN FROM SYSTEM.[user] AS u WITH ( NOLOCK ) WHERE ( u.login = @p_Login ) AND ( u.company_id = @p_CompanyID ) AND ( PWDCOMPARE (@p_Password, u.passwd) = 1 ) AND ( u.status = 0 ) --Active SELECT @errNo = @@ERROR, @recCount = @@ROWCOUNT IF ( @errNo <> 0 ) BEGIN RETURN 1010 END IF ( @recCount = 1 ) BEGIN DECLARE @userID INT SELECT @userID = id FROM #TMPLOGIN EXEC @res = SYSTEM.USP_RENEWAUTHENTICATIONTICKET @p_DoerTicket = '', @p_AuthenticationTicket = @p_AuthenticationTicket OUTPUT, @p_UserID = @userID, @p_CompanyID = @p_CompanyID IF ( @res <> 0 ) RETURN @res END --SET @p_AuthenticationTicket = 'TESTAUTHENTICATIONTICKET0123456789' IF ( @p_OutDetails = 1 ) BEGIN SELECT * FROM #TMPLOGIN END RETURN 0 END 

entrez la description de l'image ici

Attention: cette réponse a été écrite sans access à une instance de SQL Server, donc elle peut ne pas être correcte, j'espère qu'elle vous aidera. Je vais essayer de le mettre à jour plus tard quand j'ai access à un système SQL Server.

Le problème semble être que vous avez trois façons différentes d'get des valeurs de cette procédure stockée. Vous avez une valeur de return, un paramètre OUTPUT et un jeu de résultats. Si le jeu de résultats est produit dépend de la logique de votre procédure stockée, vous devez être prêt à gérer son absence.

Tout d'abord, pour get la valeur de return de la procédure stockée, vous devez utiliser:

 Ssortingng query = "{?=call [system].[usp_UserLogin(?,?,?,?,?)}"; 

?= Est la valeur de return.

Cela a également un effet sur l'indice des différents parameters. Il peut également être nécessaire d'save explicitement le premier paramètre (return) en tant que paramètre out.

Ensuite, vous devez exécuter la procédure stockée et être prêt à gérer l'absence d'un set de résultats:

 boolean firstResultIsResultSet = cs.execute(); if (firstResultIsResultSet) { ResultSet rs = cs.getResultSet(); // process result set } 

Notez que si vous aviez plusieurs jeux de résultats et que vous mettiez également à jour les counts, cela deviendrait encore plus compliqué.

Vous devriez pouvoir get la valeur de return en utilisant cs.getInt(1) , bien que je ne sois pas sûr à 100% si vous pouvez l'get avant de vérifier et de traiter le jeu de résultats. Sur cela le Javadoc pour CallableStatement dit:

Pour une portabilité maximale, ResultSet objects ResultSet et les counts de mise à jour d'un appel doivent être traités avant d'get les valeurs des parameters de sortie.