1

我在使用DbUtils從SQL Server中的存儲過程中檢索結果時遇到問題。Apache DbUtils:處理從存儲過程返回的多個結果集

在SQL Server Management Studio中執行時,存儲過程在爲特定輸入值執行時返回兩個單獨的結果集,但對於其他值,它只返回一個結果集。以下圖片說明問題:

一個結果集返回: Results with 1 Table Data

兩個結果集返回: Result with 2 Table Data

我這裏面臨的問題是我使用的是DbUtils BeanListHandler轉換的結果到UserInfo豆的列表中。

List<UserInfo> userList = (List<UserInfo>) run.query(STORED_PROC, new BeanListHandler(UserInfo.class), refId); 

當存儲過程只返回一個結果集時,它工作正常。 但是,在返回兩個結果集的情況下,它只給出第一個結果集的列表。

我認爲通過使用JDBC我們可以得到使用多個ResultSet,但我不知道如何處理這個DbUtils。

有人可以提供一個見解嗎?如果需要其他信息,請更新我提供的信息。

+0

任何人可以幫助。我不清楚我的查詢嗎? –

+0

你可以發佈存儲過程的內容嗎? – Dave

+0

@Dave我無法訪問Stored Proc中的查詢。我只能執行它才能獲得結果。 –

回答

1

對於QueryRunner對象進行子類化,然後調整適當的query方法來處理多個結果集就足夠簡單。用下面的代碼,我能夠用

ResultSetHandler<List<UserInfo>> h = new BeanListHandler<UserInfo>(UserInfo.class); 
MyQueryRunner run = new MyQueryRunner(ds); 
String sql = 
     "EXEC dbo.Gain_Web_GetCompanyRepByIndRefID @RefID=?"; 
List<UserInfo> result = run.query(sql, h, 2); 

檢索UserInfo對象的完整列表,MyQueryRunner

package com.example.so36623732; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.List; 

import javax.sql.DataSource; 

import org.apache.commons.dbutils.QueryRunner; 
import org.apache.commons.dbutils.ResultSetHandler; 

public class MyQueryRunner extends QueryRunner { 

    public MyQueryRunner(DataSource ds) { 
     super(ds); 
    } 

    /** 
    * Executes the given SELECT or EXEC SQL query and returns a result object. 
    * The <code>Connection</code> is retrieved from the 
    * <code>DataSource</code> set in the constructor. 
    * @param <T> The type of object that the handler returns 
    * @param sql The SQL statement to execute. 
    * @param rsh The handler used to create the result object from 
    * the <code>ResultSet</code>. 
    * @param params Initialize the PreparedStatement's IN parameters with 
    * this array. 
    * @return An object generated by the handler. 
    * @throws SQLException if a database access error occurs 
    */ 
    public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException { 
     Connection conn = this.prepareConnection(); 

     return this.<T>query(conn, true, sql, rsh, params); 
    } 

    /** 
    * Calls query after checking the parameters to ensure nothing is null. 
    * @param conn The connection to use for the query call. 
    * @param closeConn True if the connection should be closed, false otherwise. 
    * @param sql The SQL statement to execute. 
    * @param params An array of query replacement parameters. Each row in 
    * this array is one set of batch replacement values. 
    * @return The results of the query. 
    * @throws SQLException If there are database or parameter errors. 
    */ 
    @SuppressWarnings("unchecked") 
    private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params) 
      throws SQLException { 
     if (conn == null) { 
      throw new SQLException("Null connection"); 
     } 

     if (sql == null) { 
      if (closeConn) { 
       close(conn); 
      } 
      throw new SQLException("Null SQL statement"); 
     } 

     if (rsh == null) { 
      if (closeConn) { 
       close(conn); 
      } 
      throw new SQLException("Null ResultSetHandler"); 
     } 

     PreparedStatement stmt = null; 
     ResultSet rs = null; 
     T result = null; 
     List<T> allResults = null; 

     try { 
      stmt = this.prepareStatement(conn, sql); 
      this.fillStatement(stmt, params); 
      rs = this.wrap(stmt.executeQuery()); 
      allResults = (List<T>)rsh.handle(rs); 
      while (stmt.getMoreResults()) { 
       rs = stmt.getResultSet(); 
       result = rsh.handle(rs); 
       allResults.addAll((List<T>)result); 
      } 

     } catch (SQLException e) { 
      this.rethrow(e, sql, params); 

     } finally { 
      try { 
       close(rs); 
      } finally { 
       close(stmt); 
       if (closeConn) { 
        close(conn); 
       } 
      } 
     } 

     return (T) allResults; 
    } 

} 
+0

真棒改變它到快速代碼。謝謝 :) –

1

說實話,如果該存儲過程在一次執行中返回2個結果集,則會產生更大的問題。理想情況下,您希望將2個結果作爲SP的單個表結果返回,然後您應該可以。

1)嘗試聯繫有權訪問SP的人員並引起您的注意。讓他們創建一個臨時表來存儲返回的2個結果中的所有記錄,然後僅返回該臨時表中的所有內容。

2)如果你沒有這樣的選擇,你可以試試這個文章retrieve-data-from-stored-procedure-which-has-multiple-result-sets中概述的方法得到的結果,如果你無法從任何1移動)

HTH

戴夫

+0

謝謝你的答案。我嘗試使用本機Jdbc,並與多個結果集一起工作,但代碼冗長。有沒有什麼辦法或Api類似於Dbutils,我們可以用Beans/Pojo –

相關問題