意外的参数标记

问题描述:

,所以我的第40位意外的参数标记

得到一个

意外的参数标记,当我尝试运行我的存储过程 这是

BEGIN //line 40 
    RETURN 1010 
    END 

我不完全确定那是干什么的,如果它与我在代码中代表值的方式有关代码

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 query = "{call [system].[usp_validateUserLogin](?,?,?,?,?)}"; 
        CallableStatement ps = con.prepareCall(query); 
        ps.setString(1, userid); 
        ps.setString(2, password); 
        ps.setInt(3,72); 
        ps.setNull(4, Types.BOOLEAN); 
        ps.registerOutParameter(5, Types.VARCHAR); 
        ps.executeUpdate(); 
        Statement stmt = con.createStatement(); 
        ResultSet rs = stmt.executeQuery(query); 
        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; 

    } 
} 
} 

存储过程

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 

我的旧代码

protected String doInBackground(String... params) { 
if(userid.trim().equals("")|| password.trim().equals("")) 
z = "Please enter User Id and Password"; 
else 
{ 
try { 
Connection con = connectionClass.CONN(); 
if (con == null) { 
z = "Error in connection with SQL server"; 
} else { 
String query = "select * from Usertbl where UserId='" + userid + "' and password='" + password + "'"; 
Statement stmt = con.createStatement(); 
ResultSet rs = stmt.executeQuery(query); 

if(rs.next()) 
{ 

z = "Login successfull"; 
isSuccess=true; 
} 
else 
{ 
z = "Invalid Credentials"; 
isSuccess = false; 
} 

} 
} 
catch (Exception ex) 
{ 
isSuccess = false; 
z = "Exceptions"; 
} 
} 
return z; 
} 
} 
+0

不能确定您的SP中是否有错误,但我更愿意将我的返回码保存在一个RC变量中,并且只在返回此RC的SP末尾进行一次退出。 –

+0

SP中不应该有任何错误,因为它正在处理我们的主程序 –

+0

我假设“位置40”是查询字符串中的字符位置(圆括号开始处)。这是肯定的客户端错误,你的sp不会被执行。注意,你在'prepareCall'之前调用'executeQuery'。 –

似乎有这里有一些问题。正如Ivan Starostin指出的那样,您在prepareCall之前拨打executeQuery。另外:

CallableStatement cs = null; // This variable is cs 
String query = "{call [system].[usp_validateUserLogin] (?,?,?,?,?)}"; 
Statement stmt = con.createStatement(); 
ResultSet rs = stmt.executeQuery(query); // I assume the error is here because you're executing an empty statement 
CallableStatement ps = con.prepareCall(query); // Then you make another CallableStatement called ps 
ps.setString(1, userid); 
// other stuff with ps 
cs.executeUpdate(); // Then you ignore ps and call cs, which is null 

一个你需要作为一个程序员的技能是看你的代码一行一行地弄清楚它做什么的能力。如果你仔细查看了你的代码,你应该看到这些问题。我不是故意要苛刻,只是想让你在未来考虑如何处理这些问题,因为他们会一遍又一遍地出现。每个人都会犯错误编码,这没什么大不了的,我们只需要学习如何在出现问题时发现它们。

+0

我试图解决它,并改变CS为PS gaved我同样的错误,并移动'语句stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query);'在执行update之后更新gaved me空指针或仅使用ResultSet rs = ps.executeQuery(query);' 此类型不支持使用executeQuery(String)方法的声明 所以我abit在这里丢失 问题是,我有它在我的旧代码中运行没有任何问题,我输入的声明,但我试图从我们的SP做到这一点,我不知道如何让它与我的结构一起工作 –

+0

听起来好像你只是在尝试一些事情而不理解他们做什么。你知道你的方法中的每一行是什么吗? – nasch