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

Delphi 在TAdoConnection.OnWillExecute期间获取查询名称,delphi,logging,ado,delphi-2009,Delphi,Logging,Ado,Delphi 2009,我计划记录从ADOConnection传递到SQL Server的所有SQL查询 我找到了这个,并且能够记录所有的查询 但我还想记录查询组件(数据集)的名称。我尝试了下面的代码,但命令。Name返回为空 const cXmlDBOPStart = '<DBOP>'; const cXmlDBOPClose = '</DBOP>'; const cXmlStartTimeStart = '<StartTime>'; const cXml

我计划记录从ADOConnection传递到SQL Server的所有SQL查询

我找到了这个,并且能够记录所有的查询

但我还想记录查询组件(数据集)的名称。我尝试了下面的代码,但
命令。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;
const cxmldboopstart='';
常量cxmldboopclose='';
常量cXmlStartTimeStart='';
常数cXmlStartTimeClose='';
常数cXmlQueryStart='';
常数cXmlQueryClose='';
过程TdtmAdo.adoRover_数据将执行(连接:TADOConnection;
var-CommandText:WideString;var-CursorType:TCursorType;
var-LockType:TADOLockType;var-CommandType:TCommandType;
var ExecuteOptions:TExecuteOptions;var事件状态:TEventStatus;
const命令:_命令;const记录集:_记录集);
变量
myFile:TextFile;
开始
尝试
AssignFile(myFile,'E:\SQLLog.txt');
追加(myFile);
WriteLn(myFile,cxmldboopstart);
WriteLn(myFile,Command.Name);
WriteLn(myFile,cXmlStartTimeStart)
+FormatDateTime('DD/MM/YYYY HH:NN:SS.ZZZ',现在)
+cXmlStartTimeClose);
WriteLn(myFile,cXmlQueryStart+CommandText+cXmlQueryClose);
WriteLn(myFile,cxmldboopclose);
最后
CloseFile(myFile);
结束;
结束;

是否有任何方法获取查询名称。

TLama是一个很好的建议。类似地,这更直接一些:

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

 I : Integer;
 ADataSet : TDataSet;
 ADataSetName : String;
然后,将其添加到AssignFile()之前

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


(使用D7、Win7 64位、TAdoQuery和TAdoDatasets进行测试)

如果幸运的话,可以迭代所有数据集控件,检查它们的
记录集是否等于传递的记录集。但我从未尝试过,也许有一种更直接的方法可以做到。谢谢你的回复。它适用于select语句,但insert/update/delete语句为空。我正在寻找其他选项来记录查询名称
  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 := '';
procedure TCustomConnection.RegisterClient