该语句不返回结果集SQL Server异常

时间:2015-10-18 09:09:33

标签: java sql-server stored-procedures jdbc

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

所以这里的查询部分是一个类,它给了我所有可以传递给" 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);

1 个答案:

答案 0 :(得分:0)

当您使用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();
        }