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

 
очистка базы от удаленных записей
Alex
Отправлено: 27.05.2003, 07:18


Не зарегистрирован







Плиз подскажите, как сделать очистку базы (dbf) от удаленных записей, средствами Билдера ?
Admin
Отправлено: 27.05.2003, 13:29


Владимир

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



Это делается средствами BDE:

Table1->Close();
Table1->Exclusive=true;
Table1->Open();
DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);

Admin
Отправлено: 27.05.2003, 14:40


Владимир

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



Кстати, эта функция не подходит для таблиц Paradox,
для них используйте функцию DbiDoRestructure() с опцией bPack
или функцию PackTable() из библиотеки RXLib

Пример: упаковываем все таблицы базы данных Database1

CODE

DBIResult fDbiDoRestructure(hDBIDb hDb, char *TblName);

// начинаем упаковку
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   // получаем имена всех таблиц в ListBox1
   Database1->GetTableNames(ListBox1->Items,false);
   // если таблицы запаролены- указываем пароль
   Session->AddPassword("jIGGAe");

   for(int i=0; i<ListBox1->Items->Count; i++){
        fDbiDoRestructure(Database1->Handle, ListBox1->Items->Strings[i].c_str());
      }
}

DBIResult fDbiDoRestructure(hDBIDb hDb, char *TblName)
{
  DBIResult   rslt;
  CRTblDesc   TblDesc;

  memset((void *) &TblDesc, 0, sizeof(CRTblDesc));
  lstrcpy(TblDesc.szTblName, TblName);
  lstrcpy(TblDesc.szTblType, szPARADOX);
  TblDesc.bPack = TRUE;
  rslt = DbiDoRestructure(hDb, 1, &TblDesc, NULL, NULL,NULL, FALSE);
  if(rslt == DBIERR_NONE) ShowMessage("Successful Pack: "+String(TblName));
  return rslt;
}
//------------------------------------------------------------------------


Отредактировано Admin — 27 May 2003, 14:41
Alex
Отправлено: 28.05.2003, 09:03


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

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



Дело в том что я пытаюсь отвязаться от BDE, для облегчения переноса программы на компы, где его (BDE) нет. Делаю я это путем копирования необходимых библиотек от BDE в директорию с моей программой.
И вэтом случае
DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
у меня не работает sad.gif

Как это лечить ?
pasha
Отправлено: 28.05.2003, 17:37


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

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



Дело в том что я пытаюсь отвязаться от BDE, для облегчения переноса программы на компы, где его (BDE) нет. Делаю я это путем копирования необходимых библиотек от BDE в директорию с моей программой.


То есть, если BDE стоит не в C:\Program Files\Common Files\Borland Shared\BDE, а в другой папке, то это уже и не BDE вовсе ?

А если Вам понадобиться поставить на эти компы еще несколько
программ в разные директории, то вы в каждую директорию к
программе будете копировать файлы BDE ?

К сожалению я не разбирался досконально с BDE, но возможно
Вы скопировали не все необходимые файлы из BDE
Alex
Отправлено: 03.06.2003, 08:53


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

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



Проблемма решена, теперь база упаковывается.
Ларчик то просто открывался.

В директорию к программе, помимо файликов:
blw32.dll, idapi32.dll, idr20009.dll, iddbas32.dll, bantam.dll, charset.cvb, usa.btl как указанно в FAQ, надо добавить файлик idbat32.dll

Иначе база с помошью команды:
DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
не пакуется и выдается следующая ошибка:
Access violation at address 00000001. Read of address 00000001.

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