Одна моя программа выполняет действия по добавлению записей в базу данных:
- Код: Выделить всё
Log('Добавление записи в базу данных...');
if Terminated then Exit; //работа проходит не в основном потоке программы
NowTime := Now;
DBFResponses.Insert;
with TaskSample do
begin
DBFResponses.Fields[fiRepeated].AsBoolean := Repeated;
DBFResponses.Fields[fiExecutionTime].AsDateTime := NowTime;
... ... ... ... ...
DBFResponses.Fields[fiAC].AsLargeInt := AC
end;
DBF.Post;
Log('Запись успешно добавлена')
Другая программа, в частности, может присоединять другую такую же таблицу (с таким же набором полей):
- Код: Выделить всё
procedure TFrmDB.CopyArchiveFrom(const ArchDir: String);
var
DBF1: TDbf;
i: Integer;
begin
DtSrc.Enabled := False;
Archive := DBInitialization(Utf8ToSys(ArchDir)); //процедура по инициализации базы данных (определение полей, индексов, открытие)
Archive.Open;
while not DBF1.EOF do
begin
DBF.Insert;
for i := 1 to Archive.FieldCount - 1 do
DBF.Fields[i].Value := DBF1.Fields[i].Value; // просто копирую поля один за другим
DBF.Post;
Archive.Next;
end;
DBF1.Close;
DBF(Archive);
Dtsrc.Enabled := True
end;
Когда эти операции разнесены по времени все в порядке... Но когда пересекаются получается нечто непонятное с таблицей: все поля в порядке, кроме полей ftMemo. Текстовые поля переменной длины перемешиваются, то есть в текстовом ftMemo-поле, оказываются записи ftMemo-поля другого записи и другого поля.
Подскажите, в чем может быть дело?
Добавлено спустя 14 часов 45 минут 20 секунд:
То есть теоретически могло бы быть и так:
Когда одна программа выполнила бы действия
DBF.Insert
... ... ...
Некие действия по определения значения полей, в том числе типа Memo
В этот момент другая программа, более шустрая успевает выполнить сразу три операции над этой же базой данных:
DBF.Insert
.... .... // Операция на полями записи
DBF.Post
И первая программа после этого завершает выполнение добавления записи:
DBF.Post
Так вот может ли быть это причиной ошибки? В принципе, если бы у компонента TDBF не было бы механизмов по "разруливанию" одновременного доступа к одному файлу двух "пользователей" - это однозначно бы приводило к ошибкам в базе данных. Но ведь компонент TDBF разрешает это!? В описании к dBase говорится, что эксклюзивные права нужно получать только на время операции PackTable?