Получить данные из базы данных небольшими частями в C # - PullRequest
1 голос
/ 25 апреля 2011

В моем приложении C # у меня есть хранимая процедура, которая возвращает какие-то данные из базы данных.Входными параметрами, которые я передаю процедуре, являются дата начала, дата окончания и так называемый параметр «количество строк».Каждая строка представляет запись в базе данных.Из-за ограничений вызовов базы данных я не могу передать более 5000 строк в процедуру за вызов.Вот почему я хочу создать своего рода цикл для отправки 5000 строк, получения соответствующих данных, затем еще 5000 строк и т. Д., Пока не получу вывод строк менее 5000, что будет означать, что больше не осталось строк.Кто-нибудь может мне помочь с идеей, как это можно сделать?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2011

Я вижу только одно возможное решение для вас - вы должны выбрать свои данные по первичному ключу. СУБД вернет данные, упорядоченные по первичному ключу. Вы должны запомнить ключ с «максимальным значением», и в следующий раз вы должны добавить условие PK> «максимальное значение», где PK - первичный ключ. Это заставит СУБД возвращать вам следующий пакет данных, размер пакета, который вы можете регулировать по «количеству строк», как ранее

[EDIT]
Я не могу предоставить пример кода, потому что я на самом деле никогда не работаю с БД в C #. Но этот факт не исключает, что СУБД всегда сортирует первичный ключ таблицы. Например, у вас есть таблица со следующими столбцами:

  • ID (int) [ПК]
  • ДАННЫЕ (CHAR255)

В этой таблице идентификатор является первичным ключом. Таким образом, вы можете сделать что-то вроде ниже (pesudo code):

< declaration of array which will hold you data from DB > - intTab

SELECT * FROM < your DB tab > UP TO 5000 ROWS
  INTO CORRESPONDING FIELDS OF TABLE intTab
    WHERE < your conditions > 
      AND ID > 0.

Этот SELECT вернет вам «первые» 5000 строк из таблицы. «first» означает первые строки в индексе по первичному ключу. Чтобы выбрать следующие 5000 строк, вы должны сделать:

var maxID = < max id from intTab >

SELECT * FROM < your DB tab > UP TO 5000 ROWS
  INTO CORRESPONDING FIELDS OF TABLE intTab
    WHERE < your conditions > 
      AND ID > maxID.

Этот выбор вернет «следующие» 5000 строк из-за условия ID > maxID.

0 голосов
/ 25 апреля 2011

Если ваша хранимая процедура реализует пейджинг, вы можете сделать это следующим образом:

IEnumerable<SomeType> StoredProcedure()
{
    var results = new List<IList<SomeType>>();

    int i = 0;
    while (true)
    {
        var result = StoredProcedure(i, pageSize);
        i += pageSize;
        results.Add(result);
        if (result.Count == 0)
            break;
    }

    return results.SelectMany(r => r);
}
0 голосов
/ 25 апреля 2011

Похоже, что вы могли бы сделать с табличными параметрами , чтобы предоставить данные для хранимой процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...