Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кто подскажет с ADOQuery - DataSet ?

6.8K
25 декабря 2004 года
L0phtStar
20 / / 25.12.2004
Приветствую.

IDE: BCB 6.0

Предмет: программа по схеме TADOConnection->TADOQuery->TDataSet выбирает по запросу данные с сетевого сервера (MS SQL7.0) и отображает в таблице TDBGrid. Пользователь может сохранить то что видит в виде CSV текстового файла, для чего используется достаточно простой алгоритм:

for (int i = 0; !SHOW_LIST->DataSet->Eof; i++)
{
for (int j = 0; j < SHOW_LIST->DataSet->FieldCount; j++)
{
tmp = tmp + SHOW_LIST->DataSet->Fields->Fields[j]->AsString + “,”;
}
StringList->Add(tmp);
tmp = "";

DBM->SHOW_LIST->DataSet->Next();
}

Проблема: Все работает просто замечательно, до тех пор пока кол-во записей в таблице не переваливает примерно за 2-3 тысячи... после этого начинается следующее:
в процессе сохранения записей и перехода по строкам в DataSet программа преостанавливается на долю секнды, переходит на 1-ю запись в таблице (SHOW_LIST) и останавливается... Если снова попытаться сохранить данные, то все проходит удачно, однако после этого сбоя окно приложения перестает закрываться. Кроме того, такая ошибка не возникает, если запускать программу на сервере, где работает MS SQL непосредственно. Но на любом компе по лакалке возникает такая ситуация (причем в основном в начале, пару раз столкнувшись с ошибкой и «убив» прогу, потом она начинает работать). Я сначало думал что TDataSet не успевает получать данные по сети, однако даже если просмотреть всю таблицу перед попыткой ее сохранить, то ничего не меняется, ошибка возникает.

Кто-нибудь сталкивался? Есть идеи?
Буду благодарен за любые мысли, т.к. побороть надо срочно.
10
25 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by L0phtStar
Кто-нибудь сталкивался? Есть идеи?
Буду благодарен за любые мысли, т.к. побороть надо срочно.


Скажи пожалуйста, зачем сохранять все данные в TStringList. Ведь можно формировать строку, а потом сразу сохранять ее в файл (поток).

Скорее всего, проблема связана с перераспределением памяти при расширении TStringList. Если влом менять алгоритм работы, можешь попробовать выставить Capacity = DBM->SHOW_LIST->DataSet->RecordCount, перед началом цикла, чтобы сразу выделить необходимый объем памяти.

Потом, я не знаю, как работает с памятью TADOQuery, возможно, и у него есть какие-то проблемы. Однако свойства UniDirectional у него нет.

6.8K
25 декабря 2004 года
L0phtStar
20 / / 25.12.2004
Спасибо за скорый ответ smartsoft. Критику по поводу TStringList принимаю, однако даже если закоментировать это строку - и ничего никуда не сохранять, проблема остается. пробовал также увеличить CasheSize в ADOQuery с дефолтной 1 последовательно 10, 100, 1000 :) не спасает...

есть еще мысли?

Цитата:
Originally posted by smartsoft

Скажи пожалуйста, зачем сохранять все данные в TStringList. Ведь можно формировать строку, а потом сразу сохранять ее в файл (поток).

Скорее всего, проблема связана с перераспределением памяти при расширении TStringList. Если влом менять алгоритм работы, можешь попробовать выставить Capacity = DBM->SHOW_LIST->DataSet->RecordCount, перед началом цикла, чтобы сразу выделить необходимый объем памяти.

Потом, я не знаю, как работает с памятью TADOQuery, возможно, и у него есть какие-то проблемы. Однако свойства UniDirectional у него нет.

10
25 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by L0phtStar
есть еще мысли?


Похоже, придется копать в направлении реализации ADOQuery и вообще ADO. Может быть, у него есть какие-то ограничения. Сам ADO не использую - мы пишем под Oracle.

6.8K
25 декабря 2004 года
L0phtStar
20 / / 25.12.2004
:( боюсь что моих познаний пока не достаточно чтобы копаться в ADO... Однако пока помог глупый способ (может кому еще понадобиться): поместил на форму ProgressBar и вставил

ProgressBar->Position = i;

перед

DBM->SHOW_PRICE_LIST->DataSet->Next();

визуально видно, что в процессе сохранения таблицы из 4-х тыс строк компонента трижды притормаживает и трижды продвигается дальше. Видимо за время пока софтина перерисовывает экран DataSet успевает прийти в себя и продолжить начатое :)


Цитата:
Originally posted by smartsoft

Похоже, придется копать в направлении реализации ADOQuery и вообще ADO. Может быть, у него есть какие-то ограничения. Сам ADO не использую - мы пишем под Oracle.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог