2015-10-18 31 views
-1

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

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

请将代码简化为基本JDBC,而不进行当前正在执行的字符串操作,这会使其更容易理解。我最后还会看到时髦的东西:你使用'execute()',然后用一个'ResultSet'填充一个'CachedRowSet',它似乎没有被定义在任何地方。但是,最可能的原因是执行存储过程,结果集之前会生成结果计数。您可能想在存储过程开始时尝试添加“SET NOCOUNT ON”。 –

+0

我在SP的开头添加了SET NOCOUNT ON,但似乎没有增加任何值。 –

+0

然后请1)将您的代码降低到重现错误所需的绝对最小值,并且2)发布重现错误的最简单存储过程的代码。 –

回答

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(); 
     }