【问题标题】:The statement does not return a result set SQL Server exception该语句不返回结果集 SQL Server 异常
【发布时间】:2016-01-16 17:21:40
【问题描述】:

我有一个存储过程“executeStoredProc”,它执行另一个存储过程“SP1”。因此,在“executeStoredProc”中创建了一个临时表,然后将 SP1 的数据馈送到临时表,然后检索结果集。但是当我从 SQL Server Management Studio 执行存储过程时,我得到了结果集,但是当我使用 Prepared 语句从 jdbc 执行“executeStoredProc”时,我没有得到结果集。

所以这里的查询部分是一个类,它提供了我可以传递给“executeStoredProc”的所有参数。当我执行这个过程时,我得到一个错误,该语句没有返回结果集。

我正在使用 JDBC 来运行该过程。

QueryPart queryPart = new QueryPart(query);


    String storedProcedureName = queryPart.getFrom();
                String groupByParameters = queryPart.getGroup();
                String orderByParameters = queryPart.getOrder();
                String nullString = null;
                String whereClauseParameters = null;
                if(queryPart.getWhere()!=null){
                    whereClauseParameters = queryPart.getWhere();
                }else{
                    whereClauseParameters = nullString;
                }
                String parametersOfSP = parameter;

                String selectParameterList = null;
                String aliasParameterList = null;
                CallableStatement callableStatement = null;
                PreparedStatement pStatement = null;
                StringBuffer storedProcedureExecutionStatement  = new StringBuffer();
    StringBuffer parameters = new StringBuffer();
                if(parametersOfSP !=null){
                    String[] parameterStringArray = parametersOfSP.split(",");
                    for(int i=0;i<parameterStringArray.length;i++){
                        if(parameterStringArray[i].contains("=")){
                            parameters.append(parameterStringArray[i].split("=")[1]+",");
                        }else{
                            parameters.append(parameterStringArray[i]+",");
                        }
                    }
                }
                if (parameters.toString().endsWith(",")) {
                    parametersOfSP = parameters.toString().substring(0, parameters.length()-1);
                }else{
                    parametersOfSP = nullString;
                }

                StringBuffer selectedParameter = new StringBuffer();
                StringBuffer aliasParameter = new StringBuffer();
                String selectParameterStringStatement = query.split("From")[0].split("Select")[1];
                String[] selectParams = selectParameterStringStatement.split(",");

                for(int i=0;i<selectParams.length;i++){
                    selectedParameter.append(selectParams[i].split("AS")[0]+",");
                    aliasParameter.append(selectParams[i].split("AS")[1]+",");
                }

                if (selectedParameter.toString().endsWith(",")) {
                    selectParameterList = selectedParameter.toString().substring(0, selectedParameter.length()-1);
                }
                if (aliasParameter.toString().endsWith(",")) {
                    aliasParameterList = aliasParameter.toString().substring(0, aliasParameter.length()-1);
                }
    storedProcedureExecutionStatement.append("EXEC "+ ApplicationProperties.getValue("app.aspose.wrapperStoredProcName") 
                            +" @pi_sp_name ='"+ storedProcedureName +"',@pi_sp_params ='"+parametersOfSP+"'");
                    storedProcedureExecutionStatement.append(",@pi_col_names = '"+ selectParameterList+"'");
                    storedProcedureExecutionStatement.append(",@pi_col_aliases = '"+ aliasParameterList+"'");
                    if(whereClauseParameters!=null){
                        storedProcedureExecutionStatement.append(",@pi_where_cls = '"+whereClauseParameters+"'");
                    }else{
                        storedProcedureExecutionStatement.append(",@pi_where_cls = "+nullString);
                    }
                    if(groupByParameters!=null){
                        storedProcedureExecutionStatement.append(",@pi_group_by_cls = '"+groupByParameters+"'");
                    }else{
                        storedProcedureExecutionStatement.append(",@pi_group_by_cls = "+nullString);
                    }
                    if(orderByParameters!=null){
                        storedProcedureExecutionStatement.append(",@pi_order_by_cls = '"+orderByParameters+"'");
                    }else{
                        storedProcedureExecutionStatement.append(",@pi_order_by_cls = "+nullString);
                    }
                    pStatement = conn.prepareStatement(storedProcedureExecutionStatement.toString());
                    //rset = (ResultSet)
                    pStatement.execute();
                    crs = new CachedRowSetImpl();
                    crs.populate(rset);

【问题讨论】:

  • 请将代码简化为基本的 JDBC,不要进行当前正在执行的字符串操作,这样会更容易理解。最后我还看到了一些时髦的东西:你使用execute(),然后用似乎在任何地方都没有定义的ResultSet 填充CachedRowSet。但是,最可能的原因是执行了一个在结果集之前产生结果计数的存储过程。您可能想尝试在存储过程的开头添加SET NOCOUNT ON。
  • 好吧,我在 SP 的开头添加了 SET NOCOUNT ON 但这似乎没有增加任何价值。
  • 那么请 1) 将您的代码减少到重现错误所需的绝对最小值,并 2) 发布重现错误的最简单存储过程的代码。

标签: java sql-server stored-procedures jdbc


【解决方案1】:

当您使用Statement的execute方法执行给定的SQL语句时,它可能会返回多个结果集和输出参数。在某些情况下,单个 SQL 语句可能会返回多个结果集和/或更新计数。通常你可以忽略这个,除非你是

-执行一个你知道可能会返回多个结果的存储过程。

-动态执行未知的 SQL 字符串。

execute 方法执行一条 SQL 语句并返回一个布尔值。当值为 true 时,语句返回的第一个结果是结果集。当值为 false 时,返回的第一个结果是更新计数。然后,您必须使用方法 getResultSet 或 getUpdateCount 检索结果,并使用 getMoreResults 移动到任何后续结果。

当 SQL 语句的结果不是结果集时,getResultSet 方法将返回 null。这可能意味着结果是更新计数或没有更多结果。在这种情况下找出 null 真正含义的唯一方法是调用方法 getUpdateCount,该方法将返回一个整数。该整数将是受调用语句影响的行数,或 -1 表示结果是结果集或没有结果。如果getResultSet方法已经返回null,表示结果不是ResultSet对象,那么返回值为-1就表示没有更多结果了。

如果调用了getResultSet方法并处理了它返回的ResultSet对象,则需要调用getMoreResults方法来查看是否有另一个结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来实际检索下一个结果集。如上所述,如果 getResultSet 返回 null,则必须调用 getUpdateCount 来确定 null 是否意味着结果是更新计数或没有更多结果。

CallableStatement cs=null;
        ResultSet rs =null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection con = DriverManager.getConnection("jdbc:sqlserver://<server_ip>;databaseName=<dbName>", "<userName>", "<Password>");
            cs = con.prepareCall("exec exampleProcedure");
            int resultNum = 0;
            while (true)
              {
                  boolean queryResult;
                  int rowsAffected;
                  if (1 == ++resultNum)
                  {
                      try
                      {
                          queryResult = cs.execute();
                          System.out.println("QueryResult:"+queryResult);
                      }
                      catch (SQLException e)
                      {
                          System.out.println("Result " + resultNum + " is an error: " + e.getMessage());
                          continue;
                      }
                  }
                  else
                  {
                      try
                      {
                          queryResult = cs.getMoreResults();
                          System.out.println("QueryResult:"+queryResult);
                      }
                      catch (SQLException e)
                      {                       
                          System.out.println("Result " + resultNum + " is an error: " + e.getMessage());
                          continue;
                      }
                  }
                  if (queryResult)
                  {
                      rs = cs.getResultSet();
                      System.out.println("Result " + resultNum + " is a ResultSet: " + rs);
                      //rs.close();
                  }
                  else
                  {
                      rowsAffected = cs.getUpdateCount();
                      System.out.println("rowsAffected:"+rowsAffected);
                      if (-1 == rowsAffected)
                      {
                          --resultNum;
                          break;
                      }
                      System.out.println("Result " + resultNum + " is an update count: " + rowsAffected);
                  }
              }
        } catch (Exception e) {
            e.printStackTrace();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多