在TAdoConnection.OnWillExecute期间获取查询名称

时间:2014-07-07 13:17:51

标签: delphi logging ado delphi-2009

我打算记录从ADOConnection传递到SQL Server的所有SQL查询。

我找到了这个How can I monitor the SQL commands send over my ADO connection?并能够记录所有查询。

但我也想记录查询组件(数据集' s)的名称。我尝试了以下代码,但Command.Name返回空白。

const cXmlDBOPStart       = '<DBOP>';
const cXmlDBOPClose       = '</DBOP>';
const cXmlStartTimeStart  = '<StartTime>';
const cXmlStartTimeClose  = '</StartTime>';
const cXmlQueryStart      = '<Query>';
const cXmlQueryClose      = '</Query>';

procedure TdtmAdo.adoRover_DataWillExecute(Connection: TADOConnection;
  var CommandText: WideString; var CursorType: TCursorType;
  var LockType: TADOLockType; var CommandType: TCommandType;
  var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
  const Command: _Command; const Recordset: _Recordset);
var
   myFile : TextFile;
begin
  try
    AssignFile(myFile, 'E:\SQLLog.txt');
    Append(myFile);
    WriteLn(myFile, cXmlDBOPStart);
    WriteLn(myFile, Command.Name);
    WriteLn(myFile, cXmlStartTimeStart
        + FormatDateTime('DD/MM/YYYY HH:NN:SS.ZZZ',Now)
        + cXmlStartTimeClose);
    WriteLn(myFile, cXmlQueryStart + CommandText + cXmlQueryClose);
    WriteLn(myFile, cXmlDBOPClose);        
  finally
    CloseFile(myFile);
  end;
end;

有没有办法获取查询名称。

1 个答案:

答案 0 :(得分:2)

TLama是一个很好的建议。同样,这更直接:

向事件处理程序添加一些变量:

 I : Integer;
 ADataSet : TDataSet;
 ADataSetName : String;

然后,在AssignFile()

之前添加它
  ADataSet := Nil;
  for I := 0 to Connection.DataSetCount - 1 do begin
    if Connection.DataSets[I] is TCustomAdoDataSet then
      if TCustomAdoDataset(Connection.DataSets[I]).Recordset = RecordSet then
        ADataSet := Connection.DataSets[I];
  end;

  if ADataSet <> Nil then
    ADataSetName := ADataSet.Name
  else
    ADataSetName := '';

它起作用,因为TAdoConnection调用

procedure TCustomConnection.RegisterClient

当具有连接属性的TDataSet将属性的值设置为连接时。

(使用D7,Win7 64位和TAdoQuery和TAdoDatasets测试)