2016-11-16 27 views
4

所以我嘗試使用我們的登錄過程,問題是它有三種不同的方式來傳回信息:out參數,return valueresult,我不確定如何懷着這樣 我得到一個SQLException參數#7尚未設置

java.sql.SQLException中工作:參數#7尚未設置

什麼是我的第七PARAM,我應該究竟如何decalre呢?使這個功能

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); 
        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爲如下因素

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

我一直在努力,到目前爲止

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

gaved我

executeQuery方法必須返回一個結果

  • cs.setNull(7, Types.NULL);
  • 然後我得到一個

    java.sql.SQLException:過程或函數usp_validateUser登錄指定的參數太多。

  • cs.setInt(5, 1); 仍然是相同的

  • ResultSet rs = cs.executeQuery();

  • 代替

    boolean firstResultIsResultSet = cs.execute(); 
    
    +1

    你真的應該醃製和散列你的密碼,而不是像這樣的純文本。另外,在這裏使用NOLOCK時要非常小心。這個暗示帶來了很多人沒有完全理解的包袱。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

    +0

    我知道但我不是那個編程數據庫的人。我只是想做一個第三方程序。所以我不允許在SP中更改任何內容,因爲這會影響主程序 –

    +0

    A,但在另一個站點上我遇到過類似問題(https://coderanch.com/t/297496/databases/calling-存儲過程),他們似乎有同樣的問題。他們的'CallableStatement'只有在從查詢中取出大括號'{}'時纔有效。不知道它是否會有所幫助,但它(可能)不會因爲嘗試而受傷。 – bradimus

    回答

    1

    我認爲cs.setNull( 5,Types.BIT)不會像你期望的那樣設置默認值等於1 for @p_OutDetails)你必須做cs.setBoolean(5,真)或使用命名參數{?= call [system] .usp_validateUserLogin}

    除此之外,你的代碼很好,所以問題必須在其他地方。你真的連接到你認爲的數據庫嗎?您確定數據庫中的過程定義與您發佈的相同嗎?

    +0

    尷尬我想通了,我有一個?在我的(?,?,?,?,?)很多,但是我修正了我仍然無法登錄,所以我嘗試了cs.setboolean(5,true),然後它完美地工作 –