Отладка приложений с технологией dbExpress
Наряду с обычными методами отладки исходного кода, в dbExpress существует возможность контроля запросов, проходящих на сервер через соединение. Для этого используется компонент TSQLMonitor.
Через свойство
property SQLConnection: TSQLConnection;
компонент связывается с отлаживаемым соединением. Затем компонент включается установкой Active = True.
Теперь во время выполнения приложения сразу после открытия соединения свойство
property TraceList: TStrings;
будет заполняться информацией обо всех проходящих командах. Содержимое этого списка можно сохранить в файле при помощи метода
procedure SaveToFile(AFileName: string);
Эту же информацию можно автоматически добавлять в текстовый файл, определяемый свойством
property FileName: string;
но только тогда, когда свойство
property AutoSave: Boolean;
будет иметь значение True. Свойство
property MaxTraceCount: Integer;
определяет максимальное число контролируемых команд, а также управляет процессом контроля. При значении -1 ограничения снимаются, а при значении 0 контроль останавливается. Текущее число проверенных команд содержится в свойстве
property TraceCount: Integer;
Перед записью команды в список вызывается метод-обработчик
TTraceEvent = procedure(Sender: TObject; CBInfo: pSQLTRACEDesc;
var LogTrace: Boolean) of object;
property OnTrace: TTraceEvent;
а сразу после записи в список вызывается
TTraceLogEvent = procedure (Sender: TObject; CBInfo: pSQLTRACEDesc) of object;
property OnLogTrace: TTraceLogEvent;
Таким образом, разработчик получает компактный и симпатичный компонент, позволяющий без усилий получать информацию о прохождении команд в соединении.
Если же компонент TSQLMonitor не подходит, можно воспользоваться методом
procedure SetTraceCallbackEvent(Event: TSQLCallbackEvent; IClientlnfo: Integer);
компонента TSQLConnection. Параметр процедурного типа Event определяет функцию, которая будет вызываться при выполнении каждой команды. Параметр iclientinfo должен содержать любое число.
Он позволяет разработчику самостоятельно определить функцию типа
TSQLCallbackEvent:
TRACECat = TypedEnum;
TSQLCallbackEvent = function(CallType: TRACECat; CBInfo: Pointer): CBRType; stdcall;
Эта функция будет вызываться каждый раз при прохождении команды. Текст команды будет передаваться в буфер CBInfo. Разработчику необходимо лишь выполнить запланированные действия с буфером внутри функции.
Рассмотрим в качестве примера следующий исходный код.
function GetTracelnfо(CallType: TRACECat; CBInfo: Pointer): CBRType;
stdcall;
begin
if Assigned(Forml.TraceList) then Forml.TraceList.Add(pChar(CBinfo));
end;
procedure TForml.MyConnectionBeforeConnect(Sender: TObject);
begin
TraceList := TStringList.Create;
end;
procedure TForml.MyConnectionAfterDisconnect(Sender: TObject);
begin
if Assigned(TraceList) then
begin TraceList.SaveToFile('с:\Temp\TraceInfo.txt');
TraceList.Free;
end;
end;
procedure TForml.StartBtnClick(Sender: TObject);
begin
MyConnection.SetTraceCallbackEvent(GetTracelnfo, 8);
MyConnection.Open;
{...}
MyConnection.Close;
end;
Перед открытием соединения в методе-обработчике BeforeConnection создается объект типа TStringList. После закрытия соединения этот объект сохраняется в файле и уничтожается.
Перед открытием соединения (метод-обработчик нажатия кнопки Start) при помощи метода SetTraceCallbackEvent с соединением связывается функция GetTracelnfo.
Таким образом, по мере прохождения команд информация о них будет накапливаться в списке. После закрытия соединения список сохраняется в текстовом файле.
Примечание
В своей работе компонент TSQLMonitor также использует вызовы метода SetTraceCallbackEvent. Поэтому одновременно применять компонент и собственные функции нельзя.
Когда тот или иной физик использует понятие "физический вакуум", он либо не понимает абсурдности этого термина, либо лукавит, являясь скрытым или явным приверженцем релятивистской идеологии.
Понять абсурдность этого понятия легче всего обратившись к истокам его возникновения. Рождено оно было Полем Дираком в 1930-х, когда стало ясно, что отрицание эфира в чистом виде, как это делал великий математик, но посредственный физик Анри Пуанкаре, уже нельзя. Слишком много фактов противоречит этому.
Для защиты релятивизма Поль Дирак ввел афизическое и алогичное понятие отрицательной энергии, а затем и существование "моря" двух компенсирующих друг друга энергий в вакууме - положительной и отрицательной, а также "моря" компенсирующих друг друга частиц - виртуальных (то есть кажущихся) электронов и позитронов в вакууме.
Однако такая постановка является внутренне противоречивой (виртуальные частицы ненаблюдаемы и их по произволу можно считать в одном случае отсутствующими, а в другом - присутствующими) и противоречащей релятивизму (то есть отрицанию эфира, так как при наличии таких частиц в вакууме релятивизм уже просто невозможен). Подробнее читайте в FAQ по эфирной физике.