2016-11-21 6 views
3

別のSPに渡すための出力パラメータを取得しようとしているため、テストを作成しましたが、その文字列を取得できるかどうかはわかりますが、例外はスローされます。SQL Serverストアドプロシージャの出力パラメータとResultSet値の両方を取得する

ます。java.sql.SQLException:無効状態は、ResultSetオブジェクトは、別の例外がスローされcs.getMoreResults();なし

を閉じている:

java.sql.SQLException:出力パラメータはまだ処理されていません。 getMoreResults()を呼び出します。

私がif (rs.next()) {を削除した場合は動作します。 出力パラメータを取得しても、私のif rs.nextは引き続き使用しますか?

protected String doInBackground(String... params) { 
     if (userid.trim().equals("Developer")|| password.trim().equals("Dev!n_234")) 
      isSuccess2=true; 
     z = getString(R.string.login_succes); 
     if(userid.trim().equals("")|| password.trim().equals("")) 
      z = getString(R.string.indsæt_rigtigt_bruger); 
     else { 
      try { 
       Connection con = connectionClass.CONN(); 
       if (con == null) { 
        z = getString(R.string.Forbindelses_fejl) + "L1)"; 

       } else { 
        String ID; 
        ID = setingPreferences.getString("companyid", ""); 
        CallableStatement cs = null; 
        String query = "{ call [system].[usp_validateUserLogin](?,?,?,?,?)} "; 
        cs = con.prepareCall(query); 
        cs.setString(1, userid); 
        cs.setString(2, password); 
        cs.setString(3, ID); 
        cs.setBoolean(4, true); 
        cs.registerOutParameter(5, Types.VARCHAR); 
        ResultSet rs = cs.executeQuery(); 

        cs.getMoreResults(); 
        System.out.println("Test : " + cs.getString(5)); 

        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)+"L2)"; 
       Log.e("MYAPP", "exception", ex); 
      } 
     } 
     return z; 

    } 
} 
+0

が(HTTPS [文#getMoreResults' 'のjavadoc]を読む://ドキュメントを現在のResultSetを暗黙的に閉じます。 – bradimus

+0

'csの代わりに' cs.execute() 'を呼び出してみてください。 executeQuery() ')を実行し、' cs.getString(5) 'から出力パラメータ値を取得できるかどうかを確認してください。 –

+0

'cs.execute'は' ResultSet rs = 'と互換性がないので使用できませんが、もし 'if(rs.next()){'を取り除くと、私のコード内のもの? –

答えて

1

最初にResultSet値を処理してから、出力パラメータ値を取得する必要があります。これは、が結果セット(ref:here)を送信した後に、SQL Serverが出力パラメータ値を送信するためです。

ResultSet rs = cs.executeQuery(); 
System.out.println(cs.getString(5)); // clobbers the ResultSet 
rs.next(); // error 

をが、これは大丈夫でなければなりません:

ので、これは動作しません

ResultSet rs = cs.executeQuery(); 
if (rs.next()) { 
    // do stuff 
} 
System.out.println(cs.getString(5)); // retrieve the output parameter value 
+0

アーハーオハイオ州それは原因のために私はそこにいた前にそれを取得しようとしていた原因 –

関連する問題