我有一个问题,我尝试使用 sp 但我得到了
The executeQuery method must return a result
如果我使用 cs.execute();
和 ResultSet rs = cs.getResultSet();
而不是我在 if(rs.下一步())
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);
cs.execute();
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 = 'TESTAUTHENTICATIONTICKET0123456789'
IF ( @p_OutDetails = 1 )
BEGIN
SELECT *
FROM #TMPLOGIN
END
RETURN 0
END
最佳答案
警告:此答案是在没有访问 SQL Server 实例的情况下编写的,因此可能不正确,希望对您有所帮助。稍后当我可以访问 SQL Server 系统时,我会尝试更新它。
问题似乎是您有三种 不同的方法从该存储过程中获取值。您有一个返回值、一个 OUTPUT
参数和一个结果集。结果集是否产生取决于存储过程的逻辑,因此您必须准备好处理它的缺失。
首先,要获取存储过程的返回值,必须使用:
String query = "{?=call [system].[usp_UserLogin(?,?,?,?,?)}";
其中?=
是返回值。
这对各种参数的索引也有影响。可能还需要将第一个(返回)参数显式注册为输出参数。
然后您需要执行存储过程并准备处理缺少结果集的情况:
boolean firstResultIsResultSet = cs.execute();
if (firstResultIsResultSet) {
ResultSet rs = cs.getResultSet();
// process result set
}
请注意,如果您有多个结果集并更新计数,这会变得更加复杂。
您应该能够使用 cs.getInt(1)
获取返回值,尽管我不能 100% 确定您是否可以在检查和处理结果集之前获取它。对此,CallableStatement
的 Javadoc 说:
For maximum portability, a call's
ResultSet
objects and update counts should be processed prior to getting the values of output parameters.
关于java - executeQuery 方法必须返回结果集问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40338959/