Кто подскажет с ADOQuery - DataSet ?
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 не успевает получать данные по сети, однако даже если просмотреть всю таблицу перед попыткой ее сохранить, то ничего не меняется, ошибка возникает.
Кто-нибудь сталкивался? Есть идеи?
Буду благодарен за любые мысли, т.к. побороть надо срочно.
Цитата:
Originally posted by L0phtStar
Кто-нибудь сталкивался? Есть идеи?
Буду благодарен за любые мысли, т.к. побороть надо срочно.
Кто-нибудь сталкивался? Есть идеи?
Буду благодарен за любые мысли, т.к. побороть надо срочно.
Скажи пожалуйста, зачем сохранять все данные в TStringList. Ведь можно формировать строку, а потом сразу сохранять ее в файл (поток).
Скорее всего, проблема связана с перераспределением памяти при расширении TStringList. Если влом менять алгоритм работы, можешь попробовать выставить Capacity = DBM->SHOW_LIST->DataSet->RecordCount, перед началом цикла, чтобы сразу выделить необходимый объем памяти.
Потом, я не знаю, как работает с памятью TADOQuery, возможно, и у него есть какие-то проблемы. Однако свойства UniDirectional у него нет.
есть еще мысли?
Цитата:
Originally posted by smartsoft
Скажи пожалуйста, зачем сохранять все данные в TStringList. Ведь можно формировать строку, а потом сразу сохранять ее в файл (поток).
Скорее всего, проблема связана с перераспределением памяти при расширении TStringList. Если влом менять алгоритм работы, можешь попробовать выставить Capacity = DBM->SHOW_LIST->DataSet->RecordCount, перед началом цикла, чтобы сразу выделить необходимый объем памяти.
Потом, я не знаю, как работает с памятью TADOQuery, возможно, и у него есть какие-то проблемы. Однако свойства UniDirectional у него нет.
Скажи пожалуйста, зачем сохранять все данные в TStringList. Ведь можно формировать строку, а потом сразу сохранять ее в файл (поток).
Скорее всего, проблема связана с перераспределением памяти при расширении TStringList. Если влом менять алгоритм работы, можешь попробовать выставить Capacity = DBM->SHOW_LIST->DataSet->RecordCount, перед началом цикла, чтобы сразу выделить необходимый объем памяти.
Потом, я не знаю, как работает с памятью TADOQuery, возможно, и у него есть какие-то проблемы. Однако свойства UniDirectional у него нет.
Цитата:
Originally posted by L0phtStar
есть еще мысли?
есть еще мысли?
Похоже, придется копать в направлении реализации ADOQuery и вообще ADO. Может быть, у него есть какие-то ограничения. Сам ADO не использую - мы пишем под Oracle.
ProgressBar->Position = i;
перед
DBM->SHOW_PRICE_LIST->DataSet->Next();
визуально видно, что в процессе сохранения таблицы из 4-х тыс строк компонента трижды притормаживает и трижды продвигается дальше. Видимо за время пока софтина перерисовывает экран DataSet успевает прийти в себя и продолжить начатое :)
Цитата:
Originally posted by smartsoft
Похоже, придется копать в направлении реализации ADOQuery и вообще ADO. Может быть, у него есть какие-то ограничения. Сам ADO не использую - мы пишем под Oracle.
Похоже, придется копать в направлении реализации ADOQuery и вообще ADO. Может быть, у него есть какие-то ограничения. Сам ADO не использую - мы пишем под Oracle.