2016-10-31 17 views
2

を返す必要がありますexecuteQueryメソッドは、私はSPを使用しようとしているが、私はexecuteQueryメソッドが</p> </blockquote> <p>と私場合は、結果を返す必要があります</p> <blockquote> <p>を取得する問題があり、結果セットの問題

:私は if(rs.next())

protected String doInBackground(String...params) { 
    if (userid.trim().equals("") || password.trim().equals("")) z = getString(R.string.wrong_user); 
    else { 
     try { 
      Connection con = connectionClass.CONN(); 
      if (con == null) { 
       z = getString(R.string.connection_error); 
      } else { 
       String query = "{?=call [system].[usp_validateUserLogin](?,?,?,?,?)}"; 
        CallableStatement cs = con.prepareCall(query); 
        cs.registerOutParameter(1,Types.INTEGER); 
        cs.setString(2, userid); 
        cs.setString(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 = getString(R.string.login_succes); 
        isSuccess = true; 
       } else { 
        z = getString(R.string.Invalid_Credentials); 
        isSuccess = false; 
       } 
      } 
     } catch (Exception ex) { 
      isSuccess = false; 
      z = getString(R.string.Exceptions); 
     } 
    } 
    return z; 
} 

SPにnullポインタを取得する代わりに、ResultSet rs = cs.getResultSet();cs.execute();を使用

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 = 'TESTAUTHENTICATIONTICKET' 
     IF (@p_OutDetails = 1) 
     BEGIN 
      SELECT * 
      FROM #TMPLOGIN 
     END 

     RETURN 0 
    END 

enter image description here

+0

このストアドプロシージャは結果セットを返しますか、または「OUT」パラメータを持っていますか?ストアドプロシージャで 'set nocount on'を試してみることもできます(最初に更新カウントを返すかもしれません)。また、そのストアドプロシージャのコードをあなたの質問に追加してください。例えば、http://stackoverflow.com/questions/24428928/jdbc-sql-error-statement-did-not-return-a-result-set –

+0

これはoutパラメータを持っていますnocountがオンになっています –

+0

問題は、このストアドプロシージャに、情報を通信するための3つの異なる方法があります:outパラメータ、戻り値**、および**結果セットです。これらの結果の順序は、ストアドプロシージャのロジックによって異なります。 –

答えて

3

警告:この答えは、SQL Serverインスタンスにアクセスすることなく書かれていたので、それは正しくない可能性があり、私はそれはあなたを助けることを願っています。後でSQL Serverシステムにアクセスしたときに更新しようとします。

問題は、3つのがこのストアドプロシージャから値を取得する方法が異なるようです。戻り値、OUTPUTパラメーターと結果セットがあります。結果セットが生成される場合は、ストアドプロシージャのロジックに依存するため、その不在を処理する準備が必要です。

まず、ストアドプロシージャの戻り値を取得するには、あなたが使用する必要があります。

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

?=が戻り値です。

これは、さまざまなパラメータのインデックスにも影響します。また、最初の(return)パラメータをoutパラメータとして明示的に登録する必要があるかもしれません。

その後、ストアドプロシージャを実行する必要があり、結果セットの不在扱うように調製すること:あなたが複数の結果セットを持っているともカウントを更新するならば、これはもっとなるだろうということ

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

は注意を複雑です。

cs.getInt(1)を使用して戻り値を取得できるはずですが、結果セットを確認して処理する前に取得できるかどうかはわかりません。この上CallableStatementのJavadocは言う:最大の移植のために

は、コールのResultSetオブジェクトと更新カウントは、出力パラメータの値を取得する前に処理されるべきです。

+0

申し訳ありません私は100%確信していませんが、これは私が以前はフィルタリングと検索のためのより基本的なSPで作業していたためです。 これは 'cs.registerOutParameter(1、Types.INTEGER);です。 cs.setString(2、userid); ' 私はjava.sql.SQLExceptionを取得します。パラメータ#7は設定されていません。第7パラームは何ですか? と 'firstResultIsResultSet = cs.execute();で何を使うべきですか? if(firstResultIsResultSet){ ResultSet rs = cs.getResultSet(); '私はissucess = trueと' rs.next'の代わりにfalseを使うべきですか? –

+0

これは、 'if = 0 issucess = true else if issuces = false'のような戻り値を使うことができるcs.getInt(1)の意味ですか?より論理的にするには?私がアップロードした写真のように、 –

+0

@KewinBjörkNielsen私は最初のコメントに答える前にこれを再現する必要があります。 2番目のコメントに関しては、示されているストアドプロシージャによれば、成功は結果セットではなく戻り値から導かれるべきです。 –

関連する問題