C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Заполнение БД
Николай
Отправлено: 06.09.2004, 12:29


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Необходимо заполнить базу данных. Я делаю это так:

Table1->Active = true;
Table1->Edit();
в цикле
{


Table1->Insert();
B1=...;
Table1-> FieldByName("Date")->AsString = B1;
}
Table1->Post();

При загрузке тысячи строк происходят жуткие тормоза, может я что-то не правильно делаю?
AVC
Отправлено: 06.09.2004, 13:02


Ветеран

Группа: Модератор
Сообщений: 1583



Вам немного поможет
TField *fld = Table1-> FieldByName("Date");
в цикле ... fld->AsString = B1;

Какая СУБД ?
Николай
Отправлено: 06.09.2004, 13:24


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Используется автономная база данных, в системе Paradox.
Konstantine
Отправлено: 06.09.2004, 14:34


Мастер участка

Группа: Модератор
Сообщений: 545



Чтоб тормоза были не очень заметны вкинь в цикл строку:
CODE
Application->ProccessMessages();

Быстрее не станет, но хоть окно будет прорисовывать нормально.
AVC
Отправлено: 06.09.2004, 14:43


Ветеран

Группа: Модератор
Сообщений: 1583



Подозреваю, что на Paradox'е быстрее не станет.
Николай
Отправлено: 06.09.2004, 14:46


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Может кто подскажет, как сделать быстрее
Николай
Отправлено: 06.09.2004, 14:55


Дежурный стрелочник

Группа: Участник
Сообщений: 55



При загрузке 5000 строк можно сходить пообедать, еще и время останется
xTrim
Отправлено: 06.09.2004, 15:08


Машинист паровоза

Группа: Участник
Сообщений: 208



Если есть отображение БД в визуальные компоненты — отключать. Прибавит скорости неплохо.
CODE

DataSource1->DataSet = NULL;
//заполнение
DataSource1->DataSet = Table1;
AVC
Отправлено: 07.09.2004, 10:23


Ветеран

Группа: Модератор
Сообщений: 1583



А что у вас за техника?
Тестовый пример на копии таблицы Country.db с именем Test.db из BCDEMOS
CODE

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
TDataSet *ds = TblPdx;
DSr->DataSet = ds;
if (ds->Active) ds->Active = false;

QryPdx->SQL->Text = "Delete From test.db";
QryPdx->ExecSQL();

TDateTime dt0;

ds->DisableControls();  try {
ds->Active = true;
TField *fName = ds->FieldByName("Name");
TField *fCap  = ds->FieldByName("Capital");
dt0 = Now();

for (int i=0; i < 10000; i++)
{ ds->Insert();
  fName->AsString = AnsiString(i);
  fCap ->AsString = FormatDateTime("hh:nn:ss", Now());
  ds->Post();
}

} __finally { ds->EnableControls(); }

Memo1->Lines->Text =
AnsiString("Выполнено за ") +
FormatFloat("0.0", double(Now() — dt0) * (24*60*60)) +
" sec";


Дает результат для 10 000 строк
С разрешенными контролами: Выполнено за 21.9 sec
С запрещенными контролами: Выполнено за 0.5 sec

Может вас держит система?
Николай
Отправлено: 08.09.2004, 13:18


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Спасибо. С запрещенными контролами выходит нормально.
AVC
Отправлено: 08.09.2004, 13:31


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

При загрузке 5000 строк можно сходить пообедать, еще и время останется

Я бы не успел пообедать за 15 секунд (30 / 2) biggrin.gif
Николай
Отправлено: 08.09.2004, 13:41


Дежурный стрелочник

Группа: Участник
Сообщений: 55



biggrin.gif Нее, тогда были проблемы и с системой.

Вернуться в Вопросы программирования в C++Builder