【发布时间】:2016-10-28 09:22:52
【问题描述】:
所以我得到了一个
位置 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 = 'TESTAUTHENTICATIONTICKET0123456789'
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;
}
}
【问题讨论】:
-
不确定您的 SP 中是否有任何错误,但我更喜欢将我的返回代码保存在一个 RC 变量中,并仅在返回此 RC 的 SP 结束时退出。
-
SP 中不应该有任何错误,因为它正在我们的主程序上运行
-
我假设“位置 40”是查询字符串中的字符位置(括号开始的位置)。这肯定是客户端错误,您的 sp 未执行。请注意,您在调用
prepareCall之前调用了executeQuery。
标签: java android sql-server stored-procedures