SQL异常:未设置参数#7。

4
我正在尝试使用我们的登录程序,但问题在于它有三种不同的方式来返回信息:一个 out 参数,一个 return value 和一个 result。我不确定如何处理这些信息,因为我得到了一个

java.sql.SQLException: Parameter #7 has not been set

我的第七个参数是什么,我应该如何声明它才能使其正常工作?
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;
}

i have the SP as folowing

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  

在此输入图片描述

我一直尝试的方法:

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

提示:

executeQuery 方法必须返回结果。

  1. cs.setNull(7, Types.NULL);

结果出现:

java.sql.SQLException:指定的存储过程或函数 usp_validateUserLogin 参数太多。

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

  2. ResultSet rs = cs.executeQuery();

而不是:

boolean firstResultIsResultSet = cs.execute();

1
你真的应该使用盐和哈希算法来加密密码,而不是像这样使用明文。此外,在这里使用NOLOCK时要非常小心。这个提示会带来很多人们并不完全理解的问题。http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ - Sean Lange
你调用了 cs.Execute 两次。这很可能不是错误的原因,但也很可能不是预期的结果。请问你在哪一行遇到了错误? - Jeroen Mostert
它不是像从0开始一样愚蠢的东西吧?从0开始而不是1? - Bugs
我尝试了没有它,然后它在参数5上给了我错误,然后我尝试了使用cs.setint 1,但它又在参数7上给了我错误。 - Kewin Björk Nielsen
执行更新仍然是相同的。 - Kewin Björk Nielsen
显示剩余12条评论
1个回答

1
我认为 cs.setNull(5, Types.BIT) 不会按照您的期望行事(将默认值设置为 @p_OutDetails 的值等于 1)。您必须执行 cs.setBoolean(5, true) 或使用命名参数 {?=call [system].usp_validateUserLogin}。
除此之外,您的代码没有问题,所以问题必须出在其他地方。您是否实际连接到了您想要的数据库?您确定数据库中的存储过程定义与您发布的相同吗?

有些尴尬,我发现在我的(?,?,?,?,?)中多了一个问号,但是我纠正了它,我仍然无法登录,所以我尝试使用cs.setboolean(5,true),然后它完美地工作了。 - Kewin Björk Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接