Упаковка TTable
Подскажите, каким образом можно осуществить упаковку таблицы 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);
}
Во первых спасибо, во вторых еще один вопросик вдогонку - поле типа AutoInc при упаковке пересчитывается? Т.е. учитывается ли то, что записи с определенными номерами были удалены?
Нет. Потому, что эта таблица может быть связана с другой и может быть нарушена ссылочная целостность (Referential Integrity).
Нет. Потому, что эта таблица может быть связана с другой и может быть нарушена ссылочная целостность (Referential Integrity).
Понятно, еще раз спасибо.
Table1->Exclusive=true;
Table1->Open();
DbiPackTable(Table1->DBHandle, Table1->Handle, NULL, NULL, true);