Delphi 3 и создание приложений баз данных

       

Синхронизация содержимого наборов данных в разных приложениях


При многопользовательском режиме доступа к БД из нескольких копий одного и того же приложения бывает необходимо обеспечить такую функциональность, чтобы каждый пользователь видел подтвержденные изменения, внесенные другими пользователями.

В клиентских приложениях, работающих в рамках архитектуры "клиент-сервер", подобная функциональность обеспечивается автоматически при уровне изоляции транзакций (Read Committed) и при условии использования компонента TTable. Компонент TQuery, выполнив запрос на чтение к удаленной БД, показывает записи НД в неизменном виде, независимо от того, изменялось ли после запроса содержимое таблицы БД. Для обновления информации в НД, реализуемом при помощи TQuery, приходится закрывать и повторно открывать компонент TQuery, т.е. повторно выполнять запрос к удаленной БД. При уровне изоляции транзакций Repeatable read пользователь в рамках транзакции видит данные только в том состоянии, в котором они находились на момент старта транзакции.

В приложениях, работающих в архитектуре "файл-сервер" (с использованием таблиц локальных СУБД Paradox, dBase), не происходит обновления в наборе данных (находящегося в режиме dsBrowse) в приложении одного пользователя, после внесения изменения в эту таблицу БД другим пользователем в своем

приложении. Отображение изменений производится лишь после выполнения данным пользователем метода Post или Delete. Если НД находится в состоянии dsBrowse, его обновление можно реализовать периодически, например, с помощью таймера:

procedure TFormI.TimerlTimer(Sender: TObject) ;

begin

IF Table1.State = dsBrowse THEN Table1.Refresh; end;

или, если нужно обновлять все НД приложения:

procedure TFormI.TimerlTimer(Sender: TObject);

var DSCnt : Integer;

i : Integer; begin

WITH Session.Databases [0] do begin

DSCnt := DataSetCount; // Получаем количество открытых НД



FOR i := О ТО DSCnt - 1 do // Обновляем каждый из них

IF DataSets[i].State = dsBrowse THEN

DataSets[i].Refresh;

END;//with

end;

Если нужно обновлять лишь некоторые из наборов данных, указатели на них можно поместить в список TStringsListl. Этот список можно создать и наполнить в момент создания формы (но не в момент ее активизации, т.к. форма может активизироваться много раз - после минимизации или после вызова другого приложения). При разрушении формы список удаляется:

var

DSList : TStringList;

procedure TFormI.FormCreate(Sender: TObject);

begin

DSList := TStringList.Create; // Создаем список

DSList.AddOb]ect(' '/Tablel); // Помешаем в него ссылку на Tablel

DSList. Add0b;ect (' \Table2); // и Table2

Timeri.Enabled := True; // Включаем таймер

end;

procedure TFormI.TimerlTimer(Sender: TObject) ;

var i : Integer;

begin

WITH DSList do begin

FOR i := 0 TO Count - 1 do

IF (Objects [i] as TDataSet).State = dsBrowse THEN (Objects[i] as TDataSet).Refresh;

END;//with

end;

procedure TFormI.FormDestroy(Sender: TObject);

begin

DSList.Free;

end;



Содержание раздела