所以我嘗試使用我們的登錄過程,問題是它有三種不同的方式來傳回信息:out
參數,return value
和result
,我不確定如何懷着這樣 我得到一個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
我一直在努力,到目前爲止
String query = "{call [system].[usp_validateUserLogin](?,?,?,?,?)}";
gaved我
executeQuery方法必須返回一個結果
cs.setNull(7, Types.NULL);
cs.setInt(5, 1);
仍然是相同的ResultSet rs = cs.executeQuery();
然後我得到一個
java.sql.SQLException:過程或函數usp_validateUser登錄指定的參數太多。
代替
boolean firstResultIsResultSet = cs.execute();
你真的應該醃製和散列你的密碼,而不是像這樣的純文本。另外,在這裏使用NOLOCK時要非常小心。這個暗示帶來了很多人沒有完全理解的包袱。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –
我知道但我不是那個編程數據庫的人。我只是想做一個第三方程序。所以我不允許在SP中更改任何內容,因爲這會影響主程序 –
A,但在另一個站點上我遇到過類似問題(https://coderanch.com/t/297496/databases/calling-存儲過程),他們似乎有同樣的問題。他們的'CallableStatement'只有在從查詢中取出大括號'{}'時纔有效。不知道它是否會有所幫助,但它(可能)不會因爲嘗試而受傷。 – bradimus