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


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


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


Секреты 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.
// //]]> //

 

Интересное

Delphi и Flash. Совмещение...
Разве возможно совместить Флэш-ролики и Дельфи-приложения. Раньше я думал что НЕТ. Но теперь я знаю не только, что это возможно, но и знаю как это делается!!! И сейчас я вам расскажу об этом....
Подробнее...
Захват чужих имен
Особенности доменных имен, уже бывших в чей-то собственностиНе знаю, как вам, но мне иногда кажется, что все лучшие доменные имена уже разобрали. Не раз я придумывал потрясающее доменное имя, и...
Подробнее...
Red Hat и USB-устройства
Цель этой статьи — заставить работать мою USB мышь, USB камеру и USB жесткий диск с Linux«ом.Мой Компьютер с Emperor Linux и USBЯ начал использовать Red Hat 7.3. Хотя уже прошло много времени, и...
Подробнее...
Все, что полезно знать о BIOS
В отличие от автомобиля, техобслуживание ПК не требует познаний в механике, все взаимодействие компьютерных шестеренок происходит на программном уровне -- посредством базовой системы ввода/вывода,...
Подробнее...
Не выбрасывайте вещи в...
Случалось ли у вас такое, что открывая платяной шкаф, вы с ужасом понимали, что новые вещи положить уже некуда? Знакомая ситуация, не правда ли?Находясь в подобной ситуации, я как-то раз решила...
Подробнее...
Smarty – не просто шаблоны
Скажем сразу, этот материал не будет вас учить пользоваться базовыми возможностями данной библиотеки. Напротив, я копну гораздо глубже. Цель этого материала взглянуть на шаблонизатор Smarty с...
Подробнее...
Основы позиционирования блоков
Блоки — прямоугольные области, используемые в CSS для формирования и отображения документов. Это упрощенно, очень сильно упрощенно, но на первом этапе вполне может и хватить.С появлением нового...
Подробнее...
Как выбрать LCD-монитор?
Данная статья призвана помочь вам в таком нелегком деле, как покупка монитора. В данный момент рынок предлагает огромное количество различных моделей, отличие которых многим пользователям не...
Подробнее...
Ajax
Когда существующих возможностей становиться мало, а совершенствовать существующее уже некуда, тогда и происходит технологический прорыв. Таким прорывом и есть AJAX (Asynchronous JavaScript and...
Подробнее...
Проверка данных из формы
Наверное все встречались с некоторой недобросовестностью некоторых посетителей Вашей страничкипри отправлении форм... То ерунду какую то напишут, то неправильно укажут адрес электронной почты, то...
Подробнее...