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

📄 main.pas

📁 ODAC 5.7.0.28
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Chart, StdCtrls, TeEngine, TeeProcs, Debug, Series,
  MemDS, DBAccess, Ora, OraScript, OraLoader, OraSmart, OraCall, OdacVcl,
  Db, DBTables, ADODB, DBXpress, SqlExpr, FMTBcd, DBClient, Provider;

type
  TfmMain = class(TForm)
    OraSession: TOraSession;
    OraQuery: TOraQuery;
    scCreate: TOraScript;
    scDrop: TOraScript;
    Chart: TChart;
    Tollbar: TPanel;
    btFetchTest: TButton;
    meResult: TMemo;
    btConnect: TButton;
    btDisconnect: TButton;
    Database: TDatabase;
    BDEQuery: TQuery;
    btMasterDetailTest: TButton;
    btSPCallTest: TButton;
    Series3: TBarSeries;
    Series2: TBarSeries;
    Series1: TBarSeries;
    cbODAC: TCheckBox;
    cbBDE: TCheckBox;
    cbADO: TCheckBox;
    edFetchRows: TEdit;
    Label1: TLabel;
    btCreate: TButton;
    btDrop: TButton;
    ADOConnection: TADOConnection;
    ADOQuery: TADOQuery;
    cbMark: TCheckBox;
    OraQuery1: TOraQuery;
    BDEQuery1: TQuery;
    ADOQuery1: TADOQuery;
    ADOStoredProc: TADOStoredProc;
    OraStoredProc: TOraStoredProc;
    BDEStoredProc: TStoredProc;
    lbODAC: TLabel;
    lbBDE: TLabel;
    lbADO: TLabel;
    OraSQL: TOraSQL;
    btDataLoadingTest: TButton;
    OraLoader: TOraLoader;
    cbNet: TCheckBox;
    cbOCI7: TCheckBox;
    cbdbExpress: TCheckBox;
    lbdbExpress: TLabel;
    BorlandSQLConnection: TSQLConnection;
    BorlandSQLQuery: TSQLQuery;
    BorlandSQLQuery1: TSQLQuery;
    BorlandSQLStoredProc: TSQLStoredProc;
    Series4: TBarSeries;
    btnMultiExecuting: TButton;
    Bevel1: TBevel;
    Bevel2: TBevel;
    btnInsertPost: TButton;
    OraTable: TOraTable;
    BDETable: TTable;
    ADOTable: TADOTable;
    cbSetInternalName: TCheckBox;
    Splitter1: TSplitter;
    DataSetProvider1: TDataSetProvider;
    BorlandClientDataSet: TClientDataSet;
    BorlandSQLTable: TSQLTable;
    Bevel3: TBevel;
    cbResultLog: TCheckBox;
    Bevel4: TBevel;
    Bevel5: TBevel;
    procedure btConnectClick(Sender: TObject);
    procedure btDisconnectClick(Sender: TObject);
    procedure btFetchTestClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure edFetchRowsExit(Sender: TObject);
    procedure btCreateClick(Sender: TObject);
    procedure btDropClick(Sender: TObject);
    procedure cbMarkClick(Sender: TObject);
    procedure btMasterDetailTestClick(Sender: TObject);
    procedure btSPCallTestClick(Sender: TObject);
    procedure btDataLoadingTestClick(Sender: TObject);
    procedure OraLoaderPutData(Sender: TOraLoader);
    procedure cbNetClick(Sender: TObject);
    procedure cbOCI7Click(Sender: TObject);
    procedure btnMultiExecutingClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnInsertPostClick(Sender: TObject);
    procedure cbSetInternalNameClick(Sender: TObject);
    procedure cbResultLogClick(Sender: TObject);
  private
    TickInfo: TTickInfo;
    LoadCount: integer;

    procedure CheckConnected;
    function FetchTest(DataSet:TDataSet; Recs:integer): integer;
    function MasterDetailTest(Master: TDataSet; Detail: TDataSet; Recs: integer): integer;
    function SPCallTest(StoredProc: TComponent; Count: integer): integer;
    function DataLoadingTest(Loader: TComponent; Count: integer): integer;
    function MultiExecutingTest(Query: TComponent; Count: integer): integer;
    function InsertPostTest(Table: TDataSet; Count: integer): integer;

  public
    constructor Create(Owner:TComponent); override;
    destructor Destroy; override;
  end;

var
  fmMain: TfmMain;

implementation

uses
  OraClasses, variants;

{$R *.DFM}

constructor TfmMain.Create(Owner:TComponent);
begin
  inherited;

  TickInfo := TTickInfo.Create;
end;

destructor TfmMain.Destroy;
begin
  TickInfo.Free;

  inherited;
end;

procedure TfmMain.CheckConnected;
begin
  if (cbODAC.Checked and not OraSession.Connected) or
    (cbBDE.Checked and not Database.Connected) or
    (cbADO.Checked and not ADOConnection.Connected) or
    (cbdbExpress.Checked and not BorlandSQLConnection.Connected) then
    raise Exception.Create('You must connect first!');
end;

function TfmMain.FetchTest(DataSet:TDataSet; Recs:integer):integer;
var
  i: integer;
  OpenTime: integer;
  FetchTime: integer;
  SQL: string;
begin
  CheckConnected;

  SQL := 'SELECT * FROM Detail WHERE RowNum <= :Recs';
  try
    if DataSet is TOraQuery then begin
      meResult.Lines.Add('> ODAC');
      TOraQuery(DataSet).SQL.Text := SQL;
      TOraQuery(DataSet).ParamByName('Recs').AsInteger := Recs;
      TOraQuery(DataSet).UniDirectional:=True;
    end
    else
      if DataSet is TQuery then begin
        meResult.Lines.Add('> BDE');
        TQuery(DataSet).SQL.Text := SQL;
        TQuery(DataSet).ParamByName('Recs').AsInteger := Recs;
        TQuery(DataSet).UniDirectional := True;
      end
      else
        if DataSet is TADOQuery then begin
          meResult.Lines.Add('> ADO');
          TADOQuery(DataSet).SQL.Text := SQL;
          TADOQuery(DataSet).Parameters.ParamByName('Recs').Value := Recs;
          TADOQuery(DataSet).CursorType := ctOpenForwardOnly;
        end else
        if DataSet is TSQLQuery then begin
          meResult.Lines.Add('> dbExpress');
          TSQLQuery(DataSet).SQL.Text := SQL;
          TSQLQuery(DataSet).ParamByName('Recs').DataType := ftString;
          TSQLQuery(DataSet).ParamByName('Recs').Value := Recs;
        end;

    TickInfo.Start;
    DataSet.Open;
    OpenTime := TickInfo.GetInterval;
    meResult.Lines.Add('Opened in ' +  IntervalToStr(OpenTime));

    TickInfo.Start;

    i := 0;
    while not DataSet.EOF do begin
      Inc(i);
      DataSet.Next;
    end;
    FetchTime := TickInfo.GetInterval;
    meResult.Lines.Add('Fetched ' + IntToStr(i) + ' recs in ' + IntervalToStr(FetchTime));
    DataSet.Close;

    Result := OpenTime + FetchTime;
  finally
    if DataSet is TOraQuery then
      TOraQuery(DataSet).UniDirectional := False
    else
    if DataSet is TQuery then
      TQuery(DataSet).UniDirectional := False
    else
    if DataSet is TADOQuery then
      TADOQuery(DataSet).CursorType := ctKeyset;
  end;
end;

function TfmMain.MasterDetailTest(Master:TDataSet; Detail:TDataSet; Recs:integer):integer;
var
  i,j:integer;
  FetchTime:integer;
  SQL,SQL1: string;
begin
  CheckConnected;

  SQL := 'SELECT * FROM Master WHERE Code <= :Recs'; //RowNum
  SQL1 := 'SELECT * FROM Detail WHERE Master = :Code';
  if Master is TOraQuery then begin
    meResult.Lines.Add('> ODAC');
    TOraQuery(Master).SQL.Text := SQL;
    TOraQuery(Detail).SQL.Text := SQL1;
    TOraQuery(Master).ParamByName('Recs').AsInteger := Recs
  end
  else
    if Master is TQuery then begin
      meResult.Lines.Add('> BDE');
      TQuery(Master).SQL.Text := SQL;
      TQuery(Detail).SQL.Text := SQL1;
      TQuery(Master).ParamByName('Recs').AsInteger := Recs;
    end
    else
      if Master is TADOQuery then begin
        meResult.Lines.Add('> ADO');
        TADOQuery(Master).SQL.Text := SQL;
        TADOQuery(Detail).SQL.Text := SQL1;
        TADOQuery(Master).Parameters.ParamByName('Recs').Value := Recs;
      end else
      if Master is TSQLQuery then begin
        meResult.Lines.Add('> dbExpress');
        TSQLQuery(Master).SQL.Text := SQL;
        TSQLQuery(Detail).SQL.Text := SQL1;
        TSQLQuery(Master).ParamByName('Recs').DataType := ftString;
        TSQLQuery(Master).ParamByName('Recs').Value := Recs;
      end;

  TickInfo.Start;
  Master.Open;

  if Detail is TOraQuery then
    TOraQuery(Detail).Prepare
  else
    if Detail is TQuery then
      TQuery(Detail).Prepare
    else
      if Detail is TADOQuery then
      else
      if Detail is TSQLQuery then begin
        TSQLQuery(Detail).Prepared := True;
        TSQLQuery(Detail).ParamByName('Code').DataType := ftString;
      end;

  i := 0;
  j := 0;
  while not Master.EOF do begin
    if Detail is TOraQuery then
      TOraQuery(Detail).ParamByName('Code').AsInteger := Master.FieldByName('Code').AsInteger
    else
      if Detail is TQuery then
        TQuery(Detail).ParamByName('Code').AsInteger := Master.FieldByName('Code').AsInteger
      else
        if Detail is TADOQuery then
          TADOQuery(Detail).Parameters.ParamByName('Code').Value := Master.FieldByName('Code').AsInteger
        else
        if Detail is TSQLQuery then
          TSQLQuery(Detail).ParamByName('Code').Value := Master.FieldByName('Code').AsInteger;

    Detail.Open;
    while not Detail.EOF do begin
      Inc(j);
      Detail.Next;
    end;
    Detail.Close;

    Inc(i);
    Master.Next;
  end;
  FetchTime := TickInfo.GetInterval;
  meResult.Lines.Add('Fetched ' + IntToStr(i) + ' master recs, ' +
    IntToStr(j) + ' detail recs in ' + IntervalToStr(FetchTime));

  if Detail is TOraQuery then
    TOraQuery(Detail).UnPrepare
  else
    if Detail is TQuery then
      TQuery(Detail).UnPrepare
    else
      if Detail is TADOQuery then
      else
      if Detail is TSQLQuery then
        TSQLQuery(Detail).Prepared := false;

  Master.Close;

  Result := FetchTime;
end;

procedure TOraSQLExecute(Query: TComponent);
begin
  TOraSQL(Query).Execute;
end;

procedure TQueryExecSQL(Query: TComponent);
begin
  TQuery(Query).ExecSQL;
end;

procedure TADOQueryExecSQL(Query: TComponent);
begin
  TADOQuery(Query).ExecSQL;
end;

procedure TSQLQueryExecSQL(Query: TComponent);
begin
  TSQLQuery(Query).ExecSQL;
end;

type
  TExecSQLProc = procedure (Query: TComponent);

function TfmMain.MultiExecutingTest(Query: TComponent; Count: integer): integer;
var
  i:integer;
  ExecTime:integer;
  SQL: string;
  ExecSQLProc: TExecSQLProc;
begin
  CheckConnected;

//  SQL := 'begin null; end;';
  SQL := 'commit';

  ExecSQLProc := nil;
  if Query is TOraSQL then begin
    meResult.Lines.Add('> ODAC');
    TOraSQL(Query).SQL.Text := SQL;
    TOraSQL(Query).Prepared := True;
    ExecSQLProc := TOraSQLExecute;
  end
  else
    if Query is TQuery then begin
      meResult.Lines.Add('> BDE');
      TQuery(Query).SQL.Text := SQL;
      TQuery(Query).Prepared := True;
      ExecSQLProc := TQueryExecSQL;
    end
    else
      if Query is TADOQuery then begin
        meResult.Lines.Add('> ADO');
        TADOQuery(Query).SQL.Text := SQL;
        TADOQuery(Query).Prepared := True;
        ExecSQLProc := TADOQueryExecSQL;
      end else
      if Query is TSQLQuery then begin
        meResult.Lines.Add('> dbExpress');
        TSQLQuery(Query).SQL.Text := SQL;
        TSQLQuery(Query).Prepared := True;
        ExecSQLProc := TSQLQueryExecSQL;
      end;

  TickInfo.Start;

  for i := 1 to Count do
    ExecSQLProc(Query);

  ExecTime := TickInfo.GetInterval;
  meResult.Lines.Add('Executed ' + IntToStr(Count) + ' count ' + IntervalToStr(ExecTime));

  Result := ExecTime;
end;

function TfmMain.InsertPostTest(Table: TDataSet; Count: integer): integer;
var
  i:integer;
  ExecTime:integer;
  TableName: string;
begin
  CheckConnected;

⌨️ 快捷键说明

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