Ошибка: Failed to parse the Currency Converter XML document.
$45 242.24


Ошибка: Failed to parse the Currency Converter XML document.
$2 153.30


Ошибка: Failed to parse the Currency Converter XML document.
$901.05


Секреты Delphi. Мониторинг SQL-запросов при работе с ADO-компонентами

Не секрет, что приложения баз данных составляют довольно большую долю всех вновь разрабатываемых приложений. Ни одна информационная система не может быть создана без соединения к той или иной СУБД. В первых версиях нам предлагался давно устаревший, но все еще успешно использующийся Borland Database Engine (BDE). Одним из альтернативных способов доступа к источникам данных стали компоненты ADO.

Секреты Delphi. Мониторинг SQL-запросов при работе с ADO-компонентами

Рисунок 1. Диалоговое окно мониторинга SQL запросов

Хотя в новых версиях Delphi добавлены более современные компоненты dbExpress, а так же огромное количество компонент сторонних производителей, компоненты ADO все еще заслуживают внимания. Из-за простоты использования, интеграции со средой разработки (в поставке Delphi Enterpise), а так же довольно высокой скорости работы имеет смысл их использовать, если не планируется переходить на мультиплатформенную разработку.


Первой из рассматриваемых компонент будет TADOConnection. Не будем останавливаться на подробном процессе настройки соединения, информацию об этом можно прочитать и в help«е. Хочется отметить на отсутствие мониторинга sql запросов при работе с ADO компонентами. А при отладке программ данная функция будет далеко не последней. Особенно при работе с параметрическими запросами. Мониторинг позволяет визуально отследить, что же в действительности посылается серверу базы данных. Особую актуальность этот режим приобретает на компьютере заказчика. Delphi IDE с собой таскать ох как не хочется. Да и не на всяком компьютере развернешь эту среду разработки. Для реализации функции мониторинга напишем пару методов на события WillExecute и ExecuteComplete компоненты TADOConnection.
fExecuteTime     :dword;
...

procedure TDM.dbConnectionWillExecute(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
  i,j:integer;
  infoStr:String;
  tmpParameters:Parameters;
begin
  if gDebugMode then
    MonitorEvent(»WillExecute.. «,[]);
  fExecuteTime:=GetTickCount;
  if gSqlMonitor and gDebugMode then
  begin
    MonitorEvent(CommandText,[»«]);
    if Assigned(Recordset) then
    begin
      for i := 0 to (dbConnection.DataSetCount — 1) do
       if Assigned(dbConnection.DataSets[i].Recordset)
        and (Recordset = dbConnection.DataSets[i].Recordset) then
        if (dbConnection.DataSets[i] is TADODataSet)
          and (TADODataSet(dbConnection.DataSets[i]).Parameters.Count > 0) then
          for j:=0 to TADODataSet(dbConnection.DataSets[i]).Parameters.Count — 1 do
          begin
            infoStr:=»P[«+IntToStr(j)+»] «
            + TADODataSet(dbConnection.DataSets[i]).Parameters.Items[j].Name+» = «;
            if Not VarisNull(TADODataSet(dbConnection.DataSets[i]).
               Parameters.Items[j].Value) then
              infoStr:=infoStr
              + String(TADODataSet(dbConnection.DataSets[i]).Parameters.Items[j].Value)
            else
              infoStr:=infoStr + »Null«;
            MonitorEvent(infoStr,[»«]);
          end;
    end;
    if Assigned(Command) then
    begin
      tmpParameters:=Command.Get_Parameters;
      if (tmpParameters.Count > 0) then
        for j:=0 to tmpParameters.Count — 1 do
        begin
          infoStr:=tmpParameters.Item[j].Name+» = «;
          if Not VarisNull(tmpParameters.Item[j].Value) then
            infoStr:=infoStr + String(tmpParameters.Item[j].Value)
          else
            infoStr:=infoStr + »Null«;
          MonitorEvent(infoStr,[»«]);
        end
    end;
    MonitorEvent(»«,[»«]);
  end;
end;

procedure TDM.dbConnectionExecuteComplete(Connection: TADOConnection;
  RecordsAffected: Integer; const Error: Error;
  var EventStatus: TEventStatus; const Command: _Command;
  const Recordset: _Recordset);
begin
  Self.fExecuteTime:=GetTickCount-Self.fExecuteTime;
  if gDebugMode then
    MonitorEvent(»Execute time: « + FloatToStr(Self.fExecuteTime / 1000) + » s.',[]);
end;

Для управления режимом мониторинга и отладки введены глобальные переменные gSqlMonitor и gDebugMode. Функция вывода окна мониторинга MonitorEvent не приводится, так как написать ее очень просто. Пример реализации окна sql мониторинга показан на рисунке 1.
// //]]> //

 

Интересное

Java-приложение: заглянем...
Чтобы отладить приложение, можно поступить по-разному. Во-первых, можно воспользоваться штатным отладчиком из какого-либо программного пакета. Во-вторых, можно самостоятельно вычислить ошибку...
Подробнее...
Печать из Linux на Windows...
1. Предисловие Перед нами стоит задача печати документов на Win-принтере (Canon LBP — 810) из Linux (ALT Master 2.2/2.4). Canon LBP — 810 подключен (USB-подключение) и настроен на Win-компьютере...
Подробнее...
Внимание! Отказ в...
Описание: Уязвимость позволяет удаленному пользователю вызвать отказ в обслуживании приложения.Уязвимость существует из-за ошибки при обработке пакетов, отправленных на порт 48000 UDP/TCP....
Подробнее...
Первый прикол на Дельфи....
Привет читатель. Для написания прог-приколов тебе понадобиться комп, Delphi 6 (7 или выше) и руки, желательно прямые. 1 прикол: Голодный CD-Rom Щёлкни мыщью 2 раза по форме и там пиши...
Подробнее...
Как раскрутить сайт
Любой самый хороший сайт, сделанный с душой, специалистом в той области, которой посвящен этот сайт, с богатым контентом, раскрывающим все особенности и нюансы освещаемого предмета, или как...
Подробнее...
Windows Defender
В декабре 2004 Microsoft приобрела компанию GIANT, и её уважаемую и популярную антишпионскую утилиту. Первая бета совместного продукта появилась в январе 2005, бета 2 была выпущена практически...
Подробнее...
Обзор вариантов прокладки...
Если кто-то пытается убедить вас, что создание сети — дело сложное, не верьте: на самом деле, оно очень сложное. Тем не менее, если не замахиваться сразу на масштаб промышленного предприятия,...
Подробнее...
Интернет в розетке
Многие наверняка слышали о возможности подключению к интернету через обыкновенную бытовую электросеть. Эта технология обладает тем важнейшим преимуществом, что электросеть куда более развита и...
Подробнее...
«Резиновая вёрстка»:...
Я недавно столкнулся с задачей, в которой надо было создать двухколоночный макет страницы с «шапкой» и «подвалом», причём в коде страницы контент должен был быть расположен перед блоком...
Подробнее...
Cмешение цветов с помощью...
Привет всем. Сегодня мы будем писать програмку, которая может размыть картинку.Бросай на форму Timage и Tbutton имена оставь по умолчанию, создавай событие button1.click
Подробнее...