Одновременная работа с файлом DBF

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Одновременная работа с файлом DBF

Сообщение Ichthyander » 07.03.2009 02:59:26

Насколько я понял DBF позволяет работать с файлом DBF одновременно двум программам.
Одна моя программа выполняет действия по добавлению записей в базу данных:
Код: Выделить всё
  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?
:?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Одновременная работа с файлом DBF

Сообщение Vadim » 09.03.2009 13:00:31

Ichthyander писал(а):Насколько я понял DBF позволяет работать с файлом DBF одновременно двум программам.

Вы жестоко ошиблись. Сам формат Dbf ничего подобного не позволяет. Он лишь регламентирует заголовок файла таблицы и ничего более. Чтобы две разные программы могли работать одновременно с одним и тем же файлом DBF, должна позаботится сама программа.
Например, можно перед записью информации попытаться блокировать запись:
Код: Выделить всё
TDbf.LockRecord(Номер_записи, Буфер); //Блокируем запись
//Чего-нибудь записываем
...
TDbf.UnlockRecord(Номер_записи, Буфер); //Разблокируем запись

Можно, для верности, вообще блокировать всю таблицу с помощью LockTable().
Ichthyander писал(а):В описании к dBase говорится, что эксклюзивные права нужно получать только на время операции PackTable?

Ох, и где ж Вы такое вредное описание взяли? :) При переиндексировании индексов тоже нужен эксклюзивный доступ. Иначе, согласитесь, переиндексировав первую половину файла и приступив ко второй, Вам в эту первую половину насуют такого, что мама не горюй - индексы опять все полетят. :)

Добавлено спустя 13 минут 23 секунды:
Теперь смотрите, что у Вас получается с мемо-полями. Первые четыре байта хранят данные о ближайшем свободном блоке в мемо-файле. К примеру, ближайший свободный блок - 1024-ый ( :) ). Первая программа прочитала эти данные и вознамерилась записать в свободный блок информацию. Но вторая программа тоже прочитала те же самые данные и тоже записала информацию туда же. Что получается? Винигрет.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Одновременная работа с файлом DBF

Сообщение Vlad04 » 10.03.2009 16:26:36

Я бы посоветовал забыть про ДБФ, как про страшный сон. Я сам несколько месяцев назад столкнулся с необходимостью разработки приложения с использованием базы данных, при этом подразумевался большой объем информации и необходимость сетевого доступа. Поскольку я когда писал программы в СУБД FoxBase/FoxPro, естественно начал разработку с использования ДБФ баз. Однако, со временем, пришел к выводу, что ДБФ был хорош в ДОСе, на данный момент есть мощные и удобные СУДБ-сервера, такие как Oracle, MS SQL Server, MySQL Server.
Если приложение разрабатывается на долгий срок и в коммерческих целях, советую пересеть на SQL. Это, плюс ко всему прочему, еще и некоторая переносимость - язык SQL стандартизирован и различные сервера стараются его придерживаться. На период разработки можно использовать бесплатную версию какого-нибудь сервера.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 79
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Одновременная работа с файлом DBF

Сообщение Ichthyander » 11.03.2009 22:20:59

Удивительно дело, но Locktable не помог :(
Ошибка возникает оказывается не только когда происходит одновременное изменение в базе данных, но и когда просто одной программой производятся некие изменения, а другая просто открыта для чтения или записи (ReadOnly = False).
Помог только автоматический контроль, чтобы обе программы не открывались в режиме ReadOnly = False... Такие дела.
Vlad04 Учту :)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Одновременная работа с файлом DBF

Сообщение Vadim » 12.03.2009 05:32:56

Тогда действительно, от DBF лучше отказаться. Есть куча движков БД, где не надо устанавливать сервер, а можно обойтись одной DLL'кой. Например SQLite. В ней доступ к данным осуществляется не непосредственно программой, а через DLL'ку. У меня с ней пока не было случаев, чтобы портились данные. С базой работало три человека одновременно. Однако, хочу заметить, что для нормальной многопользовательской работы необходим именно сервер БД, который полностью отделяет пользователя от данных. У серверов БД многопользовательская работа стоит на первом месте, поэтому там уделено много внимания совместному доступу к даным, при этом программист, пишущий программу, аспектами многопользовательской работы уже может не заморачиваться
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Одновременная работа с файлом DBF

Сообщение Vlad04 » 12.03.2009 19:27:42

Действительно, Ichthyander , попробуйте MySQL - это бесплатный, многоплатформенный сервер баз данных. работает нормально, неплохо документирован, есть форумы, посвященные работе с ним (соответственно можно расчитывать на помощь). В Лазаре есть компоненты для работы с ним.
Если нужна информация по основным понятиям баз данных см. Сорокин А.В Delphi. Разработка баз данных.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 79
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Одновременная работа с файлом DBF

Сообщение alexs » 12.03.2009 20:08:04

А если нужна простота конфигурирования и сопровождения - то лучше FireBird ничего нет :-).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Одновременная работа с файлом DBF

Сообщение Verx0Laz » 13.03.2009 00:40:48

Присоединяюсь к alexs - +1 за FireBird

Если кому интересно:
knigka.ifolder.ru/2383551 - книга "Firebird: руководство разработчика баз данных" Хелен Борри в формате djvu
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

Рейтинг@Mail.ru