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

Ваш аккаунт

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

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

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

Упаковка TTable

1.1K
10 марта 2004 года
teran
73 / / 15.04.2003
Подскажите, каким образом можно осуществить упаковку таблицы TTable?
2.0K
11 марта 2004 года
Tristan
27 / / 17.10.2002
Цитата:
Originally posted by teran
Подскажите, каким образом можно осуществить упаковку таблицы TTable?



У меня работает...

#include <DBTables.hpp>
#pragma hdrstop

#include "PackTabl.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
bool __fastcall PackTabl(TTable *SourceTable)
{
bool h=SourceTable->Active;
SourceTable->Active=false;
hDBIDb hDb=0; // Handle to the Database
hDBICur hCur = 0; // Handle to the cursor (table)
DBIResult rslt; // BDE error code
CRTblDesc TblDesc; // Create Table Descriptor
Check(DbiInit(NULL));
Check(DbiOpenDatabase(
NULL, // Database name (NULL for standard Database)
NULL, // Database type (NULL for standard Database)
dbiREADWRITE, // Open mode (read-write or read-only)
dbiOPENEXCL, // Excluzive mode (shared or exclusive)
NULL, // Password (not needed for the STANDARD database)
NULL, // Number of optional parameters
NULL, // Field desc for optional parameters
NULL, // Values for the optional parameters
hDb)); // Handle to the database

AnsiString PN;// full path
if((SourceTable->DatabaseName.SubString(2,1)==":")||(SourceTable->DatabaseName.SubString(2,1)=="\\"))
PN=SourceTable->DatabaseName+"\\"+SourceTable->TableName;


else
{TStringList *MyStringList = new TStringList();
try
{Session->GetAliasParams(SourceTable->DatabaseName,MyStringList);
PN=MyStringList->Strings[0].SubString(6,MyStringList->Strings[0].Length()-5);
}
__finally
{
delete MyStringList;
}
PN+="\\"+SourceTable->TableName;
}
memset((void *) &TblDesc, 0, sizeof(CRTblDesc));

lstrcpy(TblDesc.szTblName, PN.c_str());
lstrcpy(TblDesc.szTblType, szPARADOX);
TblDesc.bPack = true;
rslt = DbiDoRestructure (hDb, 1, &TblDesc, NULL, NULL, NULL, FALSE);
if (rslt == DBIERR_NONE)
{SourceTable->Active=h;
return(true);
}
DbiError(rslt);
if (hCur != 0)
Check(DbiCloseCursor(hCur));
if (hDb != 0)
Check(DbiCloseDatabase(hDb));
Check(DbiExit());
SourceTable->Active=h;
return(false);
}

1.1K
11 марта 2004 года
teran
73 / / 15.04.2003
Во первых спасибо, во вторых еще один вопросик вдогонку - поле типа AutoInc при упаковке пересчитывается? Т.е. учитывается ли то, что записи с определенными номерами были удалены?
2.0K
12 марта 2004 года
Tristan
27 / / 17.10.2002
Цитата:
Originally posted by teran
Во первых спасибо, во вторых еще один вопросик вдогонку - поле типа AutoInc при упаковке пересчитывается? Т.е. учитывается ли то, что записи с определенными номерами были удалены?



Нет. Потому, что эта таблица может быть связана с другой и может быть нарушена ссылочная целостность (Referential Integrity).

1.1K
12 марта 2004 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by Tristan


Нет. Потому, что эта таблица может быть связана с другой и может быть нарушена ссылочная целостность (Referential Integrity).



Понятно, еще раз спасибо.

429
15 марта 2004 года
Slon
78 / / 20.01.2000
У меня работает проще:

 
Код:
Table1->Close();
Table1->Exclusive=true;
Table1->Open();
DbiPackTable(Table1->DBHandle, Table1->Handle, NULL, NULL, true);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог