【问题标题】:get both output parameter and ResultSet values from SQL Server stored procedure从 SQL Server 存储过程中获取输出参数和 ResultSet 值
【发布时间】:2017-04-05 07:47:53
【问题描述】:

我正在尝试获取传递给另一个 SP 的输出参数,所以我也创建了一个测试,看看我是否可以从中获取字符串但抛出异常:

java.sql.SQLException: 无效状态,ResultSet 对象已关闭

没有cs.getMoreResults(); 会引发另一个异常:

java.sql.SQLException:尚未处理输出参数。调用 getMoreResults()。

如果我确实删除了我的if (rs.next()) {,那么它会起作用。 如何获取输出参数并仍然使用我的if rs.next

   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 ID;
                    ID = setingPreferences.getString("companyid", "");
                    CallableStatement cs = null;
                    String query = "{ call [system].[usp_validateUserLogin](?,?,?,?,?)}  ";
                    cs = con.prepareCall(query);
                    cs.setString(1, userid);
                    cs.setString(2, password);
                    cs.setString(3, ID);
                    cs.setBoolean(4, true);
                    cs.registerOutParameter(5, Types.VARCHAR);
                    ResultSet rs = cs.executeQuery();

                    cs.getMoreResults();
                    System.out.println("Test : " + cs.getString(5));

                    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;

    }
}

【问题讨论】:

  • 读取javadoc for Statement#getMoreResults:“并隐式关闭任何当前的ResultSet”
  • 尝试调用cs.execute()(而不是cs.executeQuery()),然后看看是否可以从cs.getString(5)获取输出参数值。
  • 我不能使用cs.execute,因为它与我的ResultSet rs = 类型不兼容,但如果我删除了我的if (rs.next()) {,那么它的工作原理是如何在我的代码中同时使用这两个东西?

标签: java sql-server jdbc


【解决方案1】:

您需要先处理 ResultSet 值,然后检索输出参数值。这是因为 SQL Server 发送结果集之后发送输出参数值(参考:here)。

所以,这行不通:

ResultSet rs = cs.executeQuery();
System.out.println(cs.getString(5));  // clobbers the ResultSet
rs.next();  // error

但这应该没问题:

ResultSet rs = cs.executeQuery();
if (rs.next()) {
    // do stuff
}
System.out.println(cs.getString(5));  // retrieve the output parameter value

【讨论】:

  • 嗯,好吧,这就是它的原因,因为我试图在它出现之前得到它
猜你喜欢
  • 2021-06-29
  • 2019-02-03
  • 2012-01-26
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多