2017-02-17 2 views
0

У меня есть SqlCommand, который возвращает более 100000 строк (потенциально больше в будущем). Я хотел бы разбить создание списка (listToUse) на 500 записей за раз. Я понимаю, что мы можем сделать это в SQL довольно легко, но я вызываю хранимую процедуру из кода, поэтому хотел бы, чтобы aovid вызывал хранимую процедуру несколько раз.Выберите 500 строк за раз в SqlCommand в коде

Я хотел бы, чтобы выбрать строки

  • 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 

и хранить идентификатор последней записи восстановить, так что вы можете передать его на следующий вызов функции и добавить условию

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/* гипотетический синтаксис */ запрашивает 2 строки, начиная с 3d строки, т. Е. Возвращаются 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); 
} 
Смежные вопросы