2017-02-17 46 views
0

我有以下SqlCommand,它將返回超過100000行(將來可能會更多)。我想將創建列表(listToUse)分爲500個條目。我明白,我們可以很容易地在SQL中完成此操作,但是我正在從代碼調用存儲過程,因此想要多次調用存儲過程。在SqlCommand中一次選擇500行,代碼爲

我想選擇行

  • 0至500呼叫的方法GenereateUnpackConfigList(cmd)
  • 501至1000呼叫的方法GenereateUnpackConfigList(cmd)

listToUse是與屬性的類的一個簡單的集合。

任何幫助,非常感謝!

代碼:

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = conn; 

cmd.CommandText = "SP_RPT_V5_LS_EXP_GetOutputsForUnpackingByBatchID"; 
cmd.CommandType = CommandType.StoredProcedure; 

SqlParameter param = new SqlParameter("@BatchID", BatchID); 
param.Direction = ParameterDirection.Input; 
param.DbType = DbType.String; 
cmd.Parameters.Add(param); 

listToUse = GenereateUnpackConfigList(cmd); 
+0

你知道正在從命令返回的列?基於此,您可以創建一個班級。使用cmd.ExecuteReader()方法獲取填充了數據的SQLDataReader。循環閱讀並每次填充類的對象並將其添加到列表中。共享有關從存儲過程返回的數據的信息。我將能夠提供詳細的答案。 –

+1

重寫存儲過程使用分頁? – Fran

+0

在SQL Server ** 2012 **和更新的版本中,您可以使用[OFFSET-FETCH](https://www.mssqltips.com/sqlservertip/2362/overview-of-offset-and-fetch-feature-of- sql-server-2012 /)功能 –

回答

1

是的,你可以使用存儲過程做到這一點。只需使用

Select Top 500 * 
from <Your-table-name> 
order by Id desc 

和儲存最後記錄的ID檢索,這樣就可以通過它下一個函數調用,並添加條件

Select Top 500 * 
from <Your-table-name> 
where Id < last-record-id 
order by Id desc 
+0

感謝您關注此事。是的,甚至可以使用SQL中的限制。不過,我需要將它作爲SQLCommand進行編碼。 SELECT [3,2] * FROM MyTable ORDER BY MyColumn/* hypothetical syntax */ 查詢從3行開始的2行,即返回3d和4行。 – Abe

+0

是的,你是正確的。你也可以使用'Limit',但只有'MySql'支持。對於SQL''Top 500'是等價的。 –

+0

謝謝。是的,我已經通過了幾個這樣的鏈接,例如, http://stackoverflow.com/questions/758186/how-to-get-n-rows-starting-from-row-m-from-sorted-table- in-t-sql 但是,正如我所提到的,我需要在代碼中完成它。 – Abe

0

要通過客戶端代碼而已,擴展方法控制這個可以實現頁面瀏覽結果集。它可能是這個樣子:

public static class Extensions 
{   
    public static IList<T> PagedList<T>(this IList<T> source, int pageIndex, int pageSize) 
    { 
     var list = new List<T>(); 
     list.AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList()); 
     return list; 
    } 
} 

一個例子來調用擴展功能:

public void test(List<MyObject> listToUse, int pageSize = 500) 
{ 
    var firstBatch = listToUse.PagedList(1, pageSize); 
    var secondBatch = listToUse.PagedList(2, pageSize); 
}