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

 
Индексирование и преиндексирование
TimoN
  Отправлено: 10.07.2003, 15:41


Ученик-кочегар

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



Подскажите кто знает как ндексировать и преиндексировать БД Table'ом?
И еще вопрос как склеить одинаковые БД.
Nick
Отправлено: 10.07.2003, 16:47


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

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



Какая БД Paradox, Dbase, FoxBase, Access, Inter Base ...
Admin
Отправлено: 10.07.2003, 19:27


Владимир

Группа: Администратор
Сообщений: 1190



В Paradox-е можно так:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Table1->DatabaseName = "c:\\ddd";
Table1->TableType = ttParadox;
Table1->TableName = "myTable";

// определяем поля таблицы
Table1->FieldDefs->Clear();
TFieldDef *pNewDef = Table1->FieldDefs->AddFieldDef();
pNewDef->Name = "ID";
pNewDef->DataType = ftInteger;
pNewDef->Required = true;

pNewDef = Table1->FieldDefs->AddFieldDef();
pNewDef->Name = "Name";
pNewDef->DataType = ftString;
pNewDef->Size = 50;

// создаем таблицу
Table1->CreateTable();
Table1->Active = true;

// добавляем в таблицу 3 записи
Table1->Append();
Table1->FieldByName("ID")->Value = 1;
Table1->FieldByName("Name")->Value = "Mary";
Table1->Post();

Table1->Append();
Table1->FieldByName("ID")->Value = 2;
Table1->FieldByName("Name")->Value = "Gregor";
Table1->Post();

Table1->Append();
Table1->FieldByName("ID")->Value = 3;
Table1->FieldByName("Name")->Value = "Artur";
Table1->Post();

// индексируем таблицу по полю ID
Table1->Active = false;
Table1->Exclusive = true;
Table1->Active = true;
Table1->AddIndex("IDidx", "ID" ,TIndexOptions()<<ixPrimary<<ixUnique);
}
//---------------------------------------------------------------------------



В InterBase через backup/restore.

--------------

По поводу склеивания одинаковых БД — наверное лучше
через компонент BatchMove потаблично.
Пример из Help-a:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)

{
 if (Query1->Active)
 {
    if (SaveDialog1->Execute())
    {
       Table1->TableName = SaveDialog1->FileName;
       BatchMove1->Source = Query1;
       BatchMove1->Destination = Table1;
       BatchMove1->Mode = batCopy;
       BatchMove1->Execute();
       ShowMessage(IntToStr(BatchMove1->MovedCount) + " records copied");
    }
 }
}


А определить количество таблиц и их имена можете в
Database1->GetTableNames(ListBox1->Items, false);
Далее в цикле по всем таблицам пройтись BatchMove.


Отредактировано Admin — 10/07/2003, 20:37
TimoN
Отправлено: 11.07.2003, 08:12


Ученик-кочегар

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



QUOTE (Admin @ 10/07/2003, 20:29)
В Paradox-е можно так:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
........................................
// индексируем таблицу по полю ID
Table1->Active = false;
Table1->Exclusive = true;
Table1->Active = true;
Table1->AddIndex("IDidx", "ID" ,TIndexOptions()<<ixPrimary<<ixUnique);
}
//---------------------------------------------------------------------------



Table1->AddIndex я создам индекс, а после редактирования как переиндексировать?
TimoN
Отправлено: 11.07.2003, 08:14


Ученик-кочегар

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



QUOTE (Nick @ 10/07/2003, 17:49)
Какая БД Paradox, Dbase, FoxBase, Access, Inter Base ...

Paradox, Dbase.
Admin
Отправлено: 11.07.2003, 09:35


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE

, а после редактирования как переиндексировать?


Что значит после редактирования ??? wink.gif
При добавлении записи

Table1->Append();
....
Table1->Post();

или при удалении

Table1->Delete();

индекс будет автоматически перестроен.

Если произошло нарушение индексов и требуется заново
создать индексы по таблице, удалите файлы индексов
(можете программно) (*.px *.py и т.д.) и создайте индексы заново:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
........................................
// индексируем таблицу по полю ID
Table1->Active = false;
Table1->Exclusive = true;
Table1->Active = true;
Table1->AddIndex("IDidx", "ID" ,TIndexOptions()<<ixPrimary<<ixUnique);
}


Таблица будет заново полностью переиндексирована.

Отредактировано Admin — 11/07/2003, 11:00
TimoN
Отправлено: 14.07.2003, 08:57


Ученик-кочегар

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



QUOTE (Admin @ 11/07/2003, 10:37)
QUOTE

, а после редактирования как переиндексировать?


Что значит после редактирования ??? wink.gif
При добавлении записи

Table1->Append();
....
Table1->Post();

или при удалении

Table1->Delete();

индекс будет автоматически перестроен.

Если произошло нарушение индексов и требуется заново
создать индексы по таблице, удалите файлы индексов
(можете программно) (*.px *.py и т.д.) и создайте индексы заново:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
........................................
// индексируем таблицу по полю ID
Table1->Active = false;
Table1->Exclusive = true;
Table1->Active = true;
Table1->AddIndex("IDidx", "ID" ,TIndexOptions()<<ixPrimary<<ixUnique);
}


Таблица будет заново полностью переиндексирована.

хорошо это в парадоксе, а dbf?
Admin
Отправлено: 15.07.2003, 19:09


Владимир

Группа: Администратор
Сообщений: 1190



А с .dbf лучше писать на FoxPro
с индексами через Builder там все очень криво через BDE

Или надо через ADO или через компоненты прямого доступа
типа TDBF но и они полностью нормально
не работают.

Отредактировано Admin — 15/07/2003, 20:11

Вернуться в Работа с базами данных в C++Builder