Delphi 在TAdoConnection.OnWillExecute期间获取查询名称
我计划记录从ADOConnection传递到SQL Server的所有SQL查询 我找到了这个,并且能够记录所有的查询 但我还想记录查询组件(数据集)的名称。我尝试了下面的代码,但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
命令。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