Delphi FireDac 之SQL跟踪

        我们都知道sqlserver 管理工具 提供了Trace跟踪,可以跟踪程序执行了那些sql语句,非常的方便,今天我们自己用FireDac 来实现这个功能吧

要实现sql语句的跟踪,我们需要用到 TFDMoniFlatFileClientLink 控件,


示例

FDMoniFlatFileClientLink1.Tracing := True;

 

with FDConnection1.Params do begin

  Clear;

  Add('DriverID=SQLite');

  Add('Database=c:\test.sdb');

  Add('MonitorBy=FlatFile');

end;

 

FDConnection1.Connected := True;

...

// disable trace output for connection

FDConnection1.ConnectionIntf.Tracing := False;

...

// enable trace output for connection

FDConnection1.ConnectionIntf.Tracing := True;

不多说,上源码 


1、窗体文件 ( 在新建窗体上  右键  view as text    替换新建的窗体就ok)

object Form5: TForm5
  Left = 0
  Top = 0
  Caption = 'FireDac SQL'#35821#21477#36319#36394
  ClientHeight = 387
  ClientWidth = 641
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object dbgrd1: TDBGrid
    Left = -8
    Top = 8
    Width = 641
    Height = 0
    Align = alCustom
    DataSource = ds
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object btn1: TButton
    Left = 558
    Top = 54
    Width = 75
    Height = 25
    Caption = #26597#35810
    TabOrder = 1
    OnClick = btn1Click
  end
  object mmoLog: TMemo
    Left = 0
    Top = 280
    Width = 641
    Height = 107
    Align = alBottom
    Lines.Strings = (
      'mmoLog')
    TabOrder = 2
    ExplicitTop = 286
  end
  object dbgrd2: TDBGrid
    Left = 0
    Top = 110
    Width = 641
    Height = 170
    Align = alBottom
    DataSource = ds
    TabOrder = 3
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object dbnvgr1: TDBNavigator
    Left = 0
    Top = 85
    Width = 641
    Height = 25
    DataSource = ds
    Align = alBottom
    TabOrder = 4
    ExplicitLeft = 232
    ExplicitTop = 48
    ExplicitWidth = 240
  end
  object btn2: TButton
    Left = 472
    Top = 56
    Width = 75
    Height = 25
    Caption = #36830#25509#25968#25454#24211
    TabOrder = 5
    OnClick = btn2Click
  end
  object FDCon: TFDConnection
    Left = 144
    Top = 144
  end
  object FDQuery: TFDQuery
    Connection = FDCon
    Left = 200
    Top = 144
  end
  object GUIWaitCur: TFDGUIxWaitCursor
    Provider = 'Forms'
    Left = 504
    Top = 96
  end
  object FDMonLink: TFDMoniFlatFileClientLink
    OnOutput = FDMonLinkOutput
    FileName = 'D:\trace2.txt'
    FileAppend = True
    FileColumns = [tiMsgText]
    ShowTraces = False
    Left = 496
    Top = 144
  end
  object OraDL: TFDPhysOracleDriverLink
    Left = 520
    Top = 208
  end
  object ds: TDataSource
    DataSet = FDQuery
    Left = 248
    Top = 144
  end
end


2、对应的代码

unit umain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.VCLUI.Wait, FireDAC.Phys.OracleDef, Data.DB, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.Grids, Vcl.DBGrids, FireDAC.Phys.Oracle,
  FireDAC.Moni.Base, FireDAC.Moni.FlatFile, FireDAC.Comp.UI, FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  TForm5 = class(TForm)
    FDCon: TFDConnection;
    FDQuery: TFDQuery;
    GUIWaitCur: TFDGUIxWaitCursor;
    FDMonLink: TFDMoniFlatFileClientLink;
    OraDL: TFDPhysOracleDriverLink;
    dbgrd1: TDBGrid;
    ds: TDataSource;
    btn1: TButton;
    mmoLog: TMemo;
    dbgrd2: TDBGrid;
    dbnvgr1: TDBNavigator;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure FDMonLinkOutput(ASender: TFDMoniClientLinkBase; const AClassName, AObjName, AMessage: string);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.btn1Click(Sender: TObject);
begin
  FDQuery.Close;
  FDQuery.Open('select *From tabname where colname=''张三''');
end;

procedure TForm5.btn2Click(Sender: TObject);
begin
   FDMonLink.FileName := ExtractFilePath(Application.ExeName) + '\sqllog.txt'; //文件保存的路径
   FDMonLink.FileAppend := true; //文件是否已追加的方式存储
  //FileEncoding;//文件保存格式,默认 ANSI
  //FileColumns://文件保存那些列 【tiRefNo, tiTime, tiThreadID, tiClassName,tiObjID, tiMsgText】

  FDMonLink.EventKinds := [ekCmdExecute];  // EventKinds 过滤输出,指定输出那些类型
  {(ekLiveCycle, ekError, ekConnConnect, ekConnTransact, ekConnService, ekCmdPrepare,
    ekCmdExecute, ekCmdDataIn, ekCmdDataOut, ekAdaptUpdate,ekVendor,ekComponent)}
  FDMonLink.Tracing := True;

  with FDCon.Params do //连接参数
  begin
    Clear;
    Add('DriverID=Ora');
    Add('Database=localhost');
    Add('User_Name=ERP');
    Add('Password=ERP123');
    Add('MonitorBy=FlatFile');//这个必须加
  end;

  FDCon.Connected := True;  //连接数据库
// 关闭sql日志记录
  FDCon.ConnectionIntf.Tracing := False;
// 开启日志记录
  FDCon.ConnectionIntf.Tracing := True;

end;

procedure TForm5.FDMonLinkOutput(ASender: TFDMoniClientLinkBase; const AClassName, AObjName, AMessage: string);
begin
  mmoLog.Lines.Add(AClassName + '----' + AObjName + '-----' + AMessage);
//不设置 TFDMoniFlatFileClientLink的 FileName,不让控件自动输出日志,自己写一个写日志的方法  通过pos  AClassName, AObjName的值 这里可以进一步过滤输出



end;end.




群:Delphi Home 235236282,欢迎Delphi爱好者加入,共同学习进步。

     

你可能感兴趣的:(FireDac,delphi,FireDac,sql跟踪,Tracing,and,Monitori)