Использование Microsoft Transaction Server

Реализация этих методов имеет следующий вид:

unit del1;
//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
clip0118
Рис. 20. Модуль данных серверного объекта pays для управления таблицей ord.dbf
Теперь компонент TDatabase свяжем с созданной нами базой данных dbpay, содержащей таблицу ord.dbf (с ней мы свяжем компонент TTable, рис. 21):
clip0119
Рис. 21. Свойства компонента TDatabase серверного объекта, управляющего распределенными транзакциями
Значение свойства SQL компонента TQuery будет выглядеть следующим образом:
delete from ord where ordnum=:d
Теперь добавим в проект библиотеки типов двух созданных ранее серверов. Для этого следует выбрать из меню Delphi опцию Project/Import type library, нажать кнопку Add и выбрать соответствующий файл с расширением *.tlb (рис. 22):
clip0120
Рис. 22. Импорт библиотек типов серверных объектов - участников распределенной транзакции

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...