java - executeQuery 方法必须返回结果集问题

标签 java sql-server jdbc

我有一个问题,我尝试使用 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  

enter image description here

最佳答案

警告:此答案是在没有访问 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/

相关文章:

sql - 如何根据多列的聚合返回单行

sql - 当所有参数(在 where 子句之后)都来自一行时,缩短/减少条件/参数

java - 未实现 Postgres 错误方法 org.postgresql.jdbc.PgConnection.createClob()

java - 无效的日期时间格式 : insert date/time into Access from Java

java - Cassandra CQL 无法插入(输入时没有可行的替代方案)

java - 在运行时更改 JMeter 中测试计划的线程数

java - 404 Java 项目中的 Apache tomcat

java - 将 vector 保存到 cookie

java - 自定义 JSP 标记 - 检测是否存在其他实例

sql-server - 我的 IN 子句导致对 T-SQL 中的索引进行全面扫描。我能做些什么?