📄 multiqueries.pas
字号:
unit MultiQueries;
interface
uses
{$IFDEF LINUX}
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls,
QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, QButtons, OdacClx,
{$ELSE}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, Buttons,
OdacVcl,
{$ENDIF}
Db, DBAccess, Ora, MemDS, OdacDemoFrame, OdacDemoForm;
type
TMultiQueriesFrame = class(TOdacDemoFrame)
ConnectDialog: TConnectDialog;
OraSession2: TOraSession;
OraSession3: TOraSession;
OraSession4: TOraSession;
OraQuery1: TOraQuery;
OraQuery2: TOraQuery;
OraQuery3: TOraQuery;
OraQuery4: TOraQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DataSource3: TDataSource;
DataSource4: TDataSource;
ToolBar: TPanel;
Panel: TPanel;
Label2: TLabel;
Panel4: TPanel;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DBGrid3: TDBGrid;
DBGrid4: TDBGrid;
Splitter1: TSplitter;
Splitter2: TSplitter;
Splitter3: TSplitter;
Splitter4: TSplitter;
meSQL: TMemo;
Panel1: TPanel;
btClose: TSpeedButton;
btOpen: TSpeedButton;
btGetRP: TSpeedButton;
cbNonBlocking: TCheckBox;
cbFetchAll: TCheckBox;
cbPR: TCheckBox;
edFetchRows: TEdit;
Panel2: TPanel;
lbRP1: TLabel;
lbRP2: TLabel;
lbRP3: TLabel;
lbRP4: TLabel;
cbMultiSession: TCheckBox;
rbOne: TRadioButton;
rbTwo: TRadioButton;
rbFour: TRadioButton;
Panel5: TPanel;
Panel6: TPanel;
Panel7: TPanel;
Panel8: TPanel;
lbStatus3: TLabel;
lbStatus1: TLabel;
lbStatus2: TLabel;
lbStatus4: TLabel;
procedure btOpenClick(Sender: TObject);
procedure btCloseClick(Sender: TObject);
procedure cbFetchAllClick(Sender: TObject);
procedure cbNonBlockingClick(Sender: TObject);
procedure edFetchRowsExit(Sender: TObject);
procedure btGetRPClick(Sender: TObject);
procedure meSQLExit(Sender: TObject);
procedure cbMultiSessionClick(Sender: TObject);
procedure OraQueryAfterExecute(Sender: TObject; Result: Boolean);
procedure OraQueryAfterFetch(DataSet: TCustomDADataSet);
procedure OraQueryAfterClose(DataSet: TDataSet);
procedure SplitterMoved(Sender: TObject);
private
FStatusLabels: array of TLabel;
procedure GetRP;
procedure SetLabelCaption(DataSet: TObject; Value: string);
public
procedure Initialize; override;
procedure SetDirect(Value: boolean); override;
procedure SetDebug(Value: boolean); override;
end;
implementation
{$IFDEF CLR}
{$R *.nfm}
{$ENDIF}
{$IFDEF WIN32}
{$R *.dfm}
{$ENDIF}
{$IFDEF LINUX}
{$R *.xfm}
{$ENDIF}
procedure TMultiQueriesFrame.GetRP;
begin
lbRP1.Caption:= IntToStr(OraQuery1.RowsProcessed);
lbRP1.Update;
lbRP2.Caption:= IntToStr(OraQuery2.RowsProcessed);
lbRP2.Update;
lbRP3.Caption:= IntToStr(OraQuery3.RowsProcessed);
lbRP3.Update;
lbRP4.Caption:= IntToStr(OraQuery4.RowsProcessed);
lbRP4.Update;
end;
procedure TMultiQueriesFrame.btOpenClick(Sender: TObject);
const
Delay = 30;
MaxCnt = 70;
begin
OraQuery1.Open;
Update;
if rbTwo.Checked or rbFour.Checked then begin
if cbMultiSession.Checked and not OraSession2.Connected then begin
AssignConnectionTo(OraSession2);
OraSession2.Connect;
end;
OraQuery2.Open;
Update;
if rbFour.Checked then begin
if cbMultiSession.Checked and not OraSession3.Connected then begin
AssignConnectionTo(OraSession3);
OraSession3.Connect;
end;
OraQuery3.Open;
Update;
if cbMultiSession.Checked and not OraSession4.Connected then begin
AssignConnectionTo(OraSession4);
OraSession4.Connect;
end;
OraQuery4.Open;
Update;
end;
end;
if cbNonBlocking.Checked and cbPR.Checked then begin
// works for four datasets only
while not (OraQuery1.Fetched and OraQuery2.Fetched and OraQuery3.Fetched and OraQuery4.Fetched) and
OraQuery1.Active and OraQuery2.Active and OraQuery3.Active and OraQuery4.Active
do begin
GetRP;
Application.ProcessMessages;
end;
end;
end;
procedure TMultiQueriesFrame.btCloseClick(Sender: TObject);
begin
OraQuery1.Close;
OraQuery2.Close;
OraQuery3.Close;
OraQuery4.Close;
GetRP;
end;
procedure TMultiQueriesFrame.cbFetchAllClick(Sender: TObject);
begin
OraQuery1.FetchAll:= cbFetchAll.Checked;
OraQuery2.FetchAll:= cbFetchAll.Checked;
OraQuery3.FetchAll:= cbFetchAll.Checked;
OraQuery4.FetchAll:= cbFetchAll.Checked;
end;
procedure TMultiQueriesFrame.cbNonBlockingClick(Sender: TObject);
begin
OraQuery1.NonBlocking:= cbNonBlocking.Checked;
OraQuery2.NonBlocking:= cbNonBlocking.Checked;
OraQuery3.NonBlocking:= cbNonBlocking.Checked;
OraQuery4.NonBlocking:= cbNonBlocking.Checked;
end;
procedure TMultiQueriesFrame.edFetchRowsExit(Sender: TObject);
begin
OraQuery1.FetchRows:= StrToInt(edFetchRows.Text);
OraQuery2.FetchRows:= StrToInt(edFetchRows.Text);
OraQuery3.FetchRows:= StrToInt(edFetchRows.Text);
OraQuery4.FetchRows:= StrToInt(edFetchRows.Text);
end;
procedure TMultiQueriesFrame.btGetRPClick(Sender: TObject);
begin
GetRP;
end;
procedure TMultiQueriesFrame.meSQLExit(Sender: TObject);
begin
OraQuery1.SQL.Assign(meSQL.Lines);
OraQuery2.SQL.Assign(meSQL.Lines);
OraQuery3.SQL.Assign(meSQL.Lines);
OraQuery4.SQL.Assign(meSQL.Lines);
end;
procedure TMultiQueriesFrame.Initialize;
begin
inherited;
OraQuery1.Connection := Connection;
meSQLExit(Self);
SetLength(FStatusLabels, 4);
FStatusLabels[0] := lbStatus1;
FStatusLabels[1] := lbStatus2;
FStatusLabels[2] := lbStatus3;
FStatusLabels[3] := lbStatus4;
end;
procedure TMultiQueriesFrame.SetDirect(Value: boolean);
begin
OraSession2.Options.Direct := Value;
OraSession3.Options.Direct := Value;
OraSession4.Options.Direct := Value;
end;
procedure TMultiQueriesFrame.cbMultiSessionClick(Sender: TObject);
begin
if cbMultiSession.Checked then begin
OraQuery2.Session:= OraSession2;
OraQuery3.Session:= OraSession3;
OraQuery4.Session:= OraSession4;
end
else begin
OraQuery2.Session:= OdacForm.OraSession;
OraQuery3.Session:= OdacForm.OraSession;
OraQuery4.Session:= OdacForm.OraSession;
end;
end;
{
SELECT * FROM All_Objects
WHERE OWNER IN ('SYS','PUBLIC','SYSTEM','SCOTT')
}
procedure TMultiQueriesFrame.SetLabelCaption(DataSet: TObject; Value: string);
begin
with FStatusLabels[Byte(TComponent(DataSet).Tag) - 1] do begin
Caption := Value;
Update;
end;
end;
procedure TMultiQueriesFrame.OraQueryAfterExecute(Sender: TObject;
Result: Boolean);
begin
if Result then
SetLabelCaption(Sender, 'Executed. Fetch...')
else
SetLabelCaption(Sender, 'Execution failed!');
end;
procedure TMultiQueriesFrame.OraQueryAfterFetch(DataSet: TCustomDADataSet);
begin
SetLabelCaption(DataSet, 'Fetched');
end;
procedure TMultiQueriesFrame.OraQueryAfterClose(DataSet: TDataSet);
begin
SetLabelCaption(DataSet, '');
end;
procedure TMultiQueriesFrame.SplitterMoved(Sender: TObject);
begin
if Sender = Splitter2 then
Panel7.Width := Panel5.Width
else
Panel5.Width := Panel7.Width
end;
procedure TMultiQueriesFrame.SetDebug(Value: boolean);
begin
OraQuery1.Debug := Value;
OraQuery2.Debug := Value;
OraQuery3.Debug := Value;
OraQuery4.Debug := Value;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -