⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transaction.pas

📁 odac for oralce 8i,10g,11g easy to connect to oralce from delphi
💻 PAS
字号:
unit Transaction;

interface

uses
{$IFDEF LINUX}
  SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
  QDBCtrls, QStdCtrls, QComCtrls, QExtCtrls, QButtons, QGrids, QDBGrids, OdacClx,
{$ELSE}
  Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBCtrls, ExtCtrls, StdCtrls, ComCtrls, Buttons, Grids, DBGrids, OdacVcl,
{$ENDIF}
  DB, MemDS, DBAccess, Ora, OraTransaction, OraClasses, OdacDemoForm, OdacDemoFrame;

type
  TTransactionFrame = class(TOdacDemoFrame)
    ToolBar: TPanel;
    Panel1: TPanel;
    Query1: TOraQuery;
    DataSource1: TDataSource;
    btOpen: TSpeedButton;
    btClose: TSpeedButton;
    OraSession2: TOraSession;
    Panel2: TPanel;
    DBGrid1: TDBGrid;
    ToolBar1: TPanel;
    Label6: TLabel;
    Panel8: TPanel;
    DBNavigator2: TDBNavigator;
    Splitter1: TSplitter;
    Panel9: TPanel;
    DBGrid2: TDBGrid;
    ToolBar2: TPanel;
    Label7: TLabel;
    Panel10: TPanel;
    DBNavigator3: TDBNavigator;
    Query2: TOraQuery;
    DataSource2: TDataSource;
    Panel3: TPanel;
    OraTransaction: TOraTransaction;
    btRefresh: TSpeedButton;
    Label1: TLabel;
    cbGlobalCoordinator: TComboBox;
    Panel4: TPanel;
    Label2: TLabel;
    cbIsolationLevel: TComboBox;
    btStartTransaction: TSpeedButton;
    btCommit: TSpeedButton;
    btRollback: TSpeedButton;
    btDetach: TSpeedButton;
    btResume: TSpeedButton;
    Panel5: TPanel;
    Panel6: TPanel;
    Label3: TLabel;
    edtInactiveTimeOut: TEdit;
    Label4: TLabel;
    procedure btOpenClick(Sender: TObject);
    procedure btCloseClick(Sender: TObject);
    procedure btRefreshClick(Sender: TObject);
    procedure btStartTransactionClick(Sender: TObject);
    procedure btCommitClick(Sender: TObject);
    procedure btRollbackClick(Sender: TObject);
    procedure btDetachClick(Sender: TObject);
    procedure btResumeClick(Sender: TObject);
    procedure cbGlobalCoordinatorChange(Sender: TObject);
    procedure cbIsolationLevelChange(Sender: TObject);
  private
  public
    procedure Initialize; override;
    procedure SetDebug(Value: boolean); override;
    procedure SetDirect(Value: boolean); override;
  end;

implementation

{$IFDEF CLR}
{$R *.nfm}
{$ENDIF}
{$IFDEF WIN32}
{$R *.dfm}
{$ENDIF}
{$IFDEF LINUX}
{$R *.xfm}
{$ENDIF}

procedure TTransactionFrame.Initialize;
begin
  inherited;

  TOraSession(Connection).Disconnect; // InternalName should be set before Connect
  TOraSession(Connection).InternalName := 'con1';
  OraSession2.InternalName := 'con2';

  Query1.Connection := Connection;

  case OraTransaction.GlobalCoordinator of
    gcInternal:
      cbGlobalCoordinator.ItemIndex := 0;
  {$IFNDEF LINUX}
    gcMTS:
      cbGlobalCoordinator.ItemIndex := 1;
  {$ENDIF}
  end;

  case OraTransaction.IsolationLevel of
    ilReadCommitted:
      cbIsolationLevel.ItemIndex := 0;
    ilSerializable:
      cbIsolationLevel.ItemIndex := 1;
    ilReadOnly:
      cbIsolationLevel.ItemIndex := 2;
  end;
end;

procedure TTransactionFrame.SetDebug(Value: boolean);
begin
  Query1.Debug := Value;
  Query2.Debug := Value;
end;

procedure TTransactionFrame.SetDirect(Value: boolean);
begin
  OraSession2.Options.Direct := Value;
end;

procedure TTransactionFrame.btOpenClick(Sender: TObject);
begin
  Query1.Open;
  if not OraSession2.Connected then begin
    AssignConnectionTo(OraSession2);
    OraSession2.Connect;
  end;
  Query2.Open;
end;

procedure TTransactionFrame.btCloseClick(Sender: TObject);
begin
  Query1.Close;
  Query2.Close;
end;

procedure TTransactionFrame.btRefreshClick(Sender: TObject);
begin
  Query1.Refresh;
  Query2.Refresh;
end;

procedure TTransactionFrame.btStartTransactionClick(Sender: TObject);
var
  Id: TBytes;
begin
  OraTransaction.ClearSessions;
  if OraTransaction.GlobalCoordinator = gcInternal then begin
    SetLength(Id, 3);
    Id[0] := 3;
    Id[1] := 2;
    Id[2] := 3;
    OraTransaction.TransactionId := Id;
    SetLength(Id, 1);
    Id[0] := 1;
    OraTransaction.AddSession(OdacForm.OraSession, Id);
    Id[0] := 2;
    OraTransaction.AddSession(OraSession2, Id);

    OraTransaction.InactiveTimeOut := StrToInt(edtInactiveTimeOut.Text);
  end
  else begin
    OraTransaction.AddSession(OdacForm.OraSession);
    OraTransaction.AddSession(OraSession2);
  end;

  OdacForm.OraSession.Connect;
  OraSession2.Connect;

  OraTransaction.StartTransaction;
end;

procedure TTransactionFrame.btCommitClick(Sender: TObject);
begin
  OraTransaction.Commit;
end;

procedure TTransactionFrame.btRollbackClick(Sender: TObject);
begin
  OraTransaction.Rollback;
  btRefreshClick(nil);
end;

procedure TTransactionFrame.btDetachClick(Sender: TObject);
begin
  OraTransaction.Detach;
  btRefreshClick(nil);
end;

procedure TTransactionFrame.btResumeClick(Sender: TObject);
begin
  OraTransaction.Resume;
  btRefreshClick(nil);
end;

procedure TTransactionFrame.cbGlobalCoordinatorChange(Sender: TObject);
begin
  try
    case cbGlobalCoordinator.ItemIndex of
      0:
        OraTransaction.GlobalCoordinator := gcInternal;
    {$IFNDEF LINUX}
      1:
        OraTransaction.GlobalCoordinator := gcMTS;
    {$ENDIF}
    end;
  except
    case OraTransaction.GlobalCoordinator of
      gcInternal:
        cbGlobalCoordinator.ItemIndex := 0;
    {$IFNDEF LINUX}
      gcMTS:
        cbGlobalCoordinator.ItemIndex := 1;
    {$ENDIF}
    end;
    raise;
  end;
end;

procedure TTransactionFrame.cbIsolationLevelChange(Sender: TObject);
begin
  try
    case cbIsolationLevel.ItemIndex of
      0:
        OraTransaction.IsolationLevel := ilReadCommitted;
      1:
        OraTransaction.IsolationLevel := ilSerializable;
      2:
        OraTransaction.IsolationLevel := ilReadOnly;
    end;
  except
    case OraTransaction.IsolationLevel of
      ilReadCommitted:
        cbIsolationLevel.ItemIndex := 0;
      ilSerializable:
        cbIsolationLevel.ItemIndex := 1;
      ilReadOnly:
        cbIsolationLevel.ItemIndex := 2;
    end;
    raise;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -