Использование Microsoft Transaction Server
Реализация этих методов имеет следующий вид:
//Another simple MTS server
//By N.Elmanova
//01.12.1998
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComServ, ComObj, VCLCom, StdVcl, BdeProv, BdeMts, DataBkr, DBClient,
MtsRdm, Mtx, dels_TLB, DBTables, Provider, Db;
type
TdelDM = class(TMtsDataModule, IdelDM)
deltable: TTable;
DelProvider: TProvider;
Database2: TDatabase;
Query4: TQuery;
Session2: TSession;
private
{ Private declarations }
public
{ Public declarations }
protected
function GetDelivery: OleVariant; safecall;
procedure AddDelivery(OrdNum: Integer; const OrdName: WideString; const OrdAddr: WideString);
safecall;
procedure DelDelivery(OrdNum: Integer); safecall;
end;
var
delDM: TdelDM;
implementation
{$R *.DFM}
function TdelDM.GetDelivery: OleVariant;
begin
Result:=DelProvider.Data;
SetComplete;
end;
procedure TdelDM.AddDelivery(OrdNum: Integer;
const OrdName: WideString; const OrdAddr: WideString);
begin
try
deltable.open;
deltable.append;
deltable.fieldbyname('OrdNum').Value:=OrdNum;
deltable.fieldbyname('GoodsName').Value:=OrdName;
deltable.fieldbyname('Address').Value:=OrdAddr;
deltable.post;
deltable.close;
SetComplete;
except
SetAbort;
raise;
end;
end;
procedure TdelDM.DelDelivery(OrdNum: Integer);
begin
try
database2.open;
deltable.open;
deltable.SetRangeStart;
deltable.FieldByName('OrdNum').AsInteger:=OrdNum;
deltable.SetRangeEnd;
deltable.FieldByName('OrdNum').AsInteger:=OrdNum;
deltable.ApplyRange;
deltable.Delete;
deltable.close;
database2.close;
except
SetAbort;
raise;
end;
end;
initialization
TComponentFactory.Create(ComServer, TdelDM,
Class_delDM, ciMultiInstance, tmApartment);
end.
Скомпилируем и установим данный объект в тот же "пакет", что и предыдущий.
Рекомендуется протестировать данный объект, создав клиентское приложение, более или менее аналогичное предыдущему. При тестировании следует помнить, что в этой таблице есть уникальный первичный ключ, поэтому при вводе записей с одинаковым значением поля OrdNum транзакции завершаться не будут.
И, наконец, создадим третий серверный объект, который будет управлять распределенными транзакциями и с этой целью порождать два предыдущих серверных объекта внутри своих транзакций. Вначале создадим объект, аналогичный двум предыдущим (рис. 20):
delete from ord where ordnum=:d
Рис. 20. Модуль данных серверного объекта pays для управления таблицей ord.dbf
Теперь компонент TDatabase свяжем с созданной нами базой данных dbpay, содержащей таблицу ord.dbf (с ней мы свяжем компонент TTable, рис. 21):
Рис. 21. Свойства компонента TDatabase серверного объекта, управляющего распределенными транзакциями
Значение свойства SQL компонента TQuery будет выглядеть следующим образом:
delete from ord where ordnum=:d
Теперь добавим в проект библиотеки типов двух созданных ранее серверов. Для этого следует выбрать из меню Delphi опцию Project/Import type library, нажать кнопку Add и выбрать соответствующий файл с расширением *.tlb (рис. 22):
Рис. 22. Импорт библиотек типов серверных объектов - участников распределенной транзакции
Отправить комментарий