Автор: delphi | 14.12.2007 в 9:21 | Рубрики: Базы данных

Я обнаружил, что открытый Data Desktop, даже без открытых объектов, может создавать “помехи”. Также мудрит открытая сессия Delphi, если вы запускаете собранное приложение вне IDE. Я допускаю, что если вы закрываете все объекты под DD, конфигурация BDE быстро себя не очистит. Наверное мне следовало бы запустить мое приложение пару недель спустя, но я реально предполагаю, что множество сеансов Paradox блокируют бедный BDE.

Пожалуйста запустите утилиту BDE Config, поставляемую с Delphi и с PdoxWin. Перейдите на страницу SYSTEM и проверьте, установлен ли параметр LOCAL SHARE. Если вы хотите, что несколько приложений имели доступ к данным Paradox, LOCAL SHARE должен быть установлен в TRUE (и должны быть загружены SHARE или VCACHE).

При этом вы должны принимать во внимание, что если вы хотите, чтобы “LOCAL SHARE = TRUE” все время работал правильно и надежно, вы должны также определить уникальные индивидуальные каталоги для всех приложений, использующих BDE для доступа к таблицам Paradox. В противном случае, “поведение по умолчанию” заставит BDE использовать текущий рабочий каталог как частный. И, как вы все догадываетесь, Pdox блокирует данный каталог, считая его “частной собственностью” и не допуская к табличкам остальных соперников . . . то-то, а вы говорите “блокируют бедный BDE”.

Автор: delphi | в 9:21 | Рубрики: Базы данных

var
Session: hTUses;
i: integer;
ErrorCode: word;
ResultCode: word;

procedure BdeError(ResultCode: Word);
begin
if ResultCode <> 0 then
raise Exception.CreateFmt(’BDE ошибка %x’, [ResultCode]);
end;

begin
try
BdeError(DbiInit(nil));
BdeError(TUInit(@Session));

for i := 1 to High(TableNames) do
begin
WriteLn(’Проверка ‘ + TableNames[i]);

ResultCode := TUVerifyTable(Session, @TableNames[i, 1], szPARADOX,
‘TABLERRS.DB’, nil, TU_Append_Errors, ErrorCode);
BdeError(ResultCode);

if ErrorCode = 0 then
WriteLn(’Успешно’)
else
WriteLn(’ОШИБКА! — Для информации смотри TABLERRS.DB!’);

WriteLn(”);
end;
finally
BdeError(TUExit(Session));
BdeError(DbiExit);
end;
end.

Таблицы Paradox имеют характеристику проверки целостности (Referential Integrity). Данная характеристика предотвращает добавление записей в дочернюю таблицу, для которых нет соответствующих записей в родительской таблице. Это также изменяет ключевое(ые) поле(я) в дочерней таблице при изменениях в соответствующем(их) ключевом(ых) поле(ях) родительской таблицы (обычно это называют каскадированным обновлением). Эти события происходят автоматически, и не требуют никакого вмешательства со стороны Delphi-приложений, использующих эти таблицы. Тем не менее, характеристика проверки целостности таблиц Paradox не работает с каскадированным удалением. То есть, Delphi не позволит вам удалять записи в родительской таблице при наличии существующих записей в дочерней таблице. Это могут сделать только дочерние записи “без родителей”, обходя проверку целостности. При попытке удаления такой родительской записи, Delphi сгенерит объект исключительной ситуации. Читать полностью…

var
db: TDatabase;
Desc: CRTblDesc;
begin
db := PriceTable.OpenDatabase;
FillChar( Desc, SizeOf( Desc ), #0 );
StrCopy( Desc.szTblName, PChar( PriceTable.TableName ) );
StrCopy( Desc.szTblType, szParadox );
StrCopy( Desc.szPassword, ‘password’ );
Desc.bProtected := TRUE;
Check( DbiDoRestructure( db.Handle, 1, @Desc, nil, nil, nil, FALSE ) );
end;

Автор: delphi | в 9:21 | Рубрики: Базы данных

Вот маленький кусочек кода для создания таблицы Paradox:

with TTable.create(self) do
begin
DatabaseName := ‘C:\temp’;
TableName := ‘FOO’;
TableType := ttParadox;
with FieldDefs do
begin
Add(’Age’, ftInteger, 0, True);
Add(’Name’, ftString, 25, False);
Add(’Weight’, ftFloat, 0, False);
end;
IndexDefs.Add(’MainIndex’, ‘IntField’, [ixPrimary, ixUnique]);
CreateTable;
end;