Проблема с DbiPackTable!!!
DbiPackTable(Table->DBHandle,Table->Handle,NULL,NULL,true);
Но не так то все просто. Таблица при этом остается занятой и не дает этого сделать.
Вот моя функция переупаковки таблицы:
void __fastcall TVDHMainForm::PackTable(TTable *Table)
{
Table->Close();
Table->Exclusive = true;
Table->Open();
DbiPackTable(Table->DBHandle,Table->Handle,NULL,NULL,true);
Table->Close();
Table->Exclusive = false;
Table->Open();
}
без Table->Exclusive = true; почему-то работает, а сним не хочет :( хротя говорят что это нужно.
//---------------------------------------------------------------------------
#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;
if((SourceTable->DatabaseName.SubString(2,1)==":")||(SourceTable->DatabaseName.SubString(2,1)=="\\"))
{PN=SourceTable->DatabaseName+"\\";
PN=PN+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=PN+"\\";
PN=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);
}
Я пользуюсь DbiDoRestructure, вроде работает...
//---------------------------------------------------------------------------
Насколько я помню DbiDoRestructure для таблиц Paradox, а мне надо для FoxPro, DBase ... вот