我打算记录从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;
有没有办法获取查询名称。
答案 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测试)