Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Логирование запросов в dbGo


Автор: VihaVik 16.11.2007, 11:59
Подскажите как возможно логировать запросы посылаемые на сервер MS Jet.Ole.Db от DataSet-a.

Автор: Rodman 17.11.2007, 23:29
что имеется ввиду под логирование... объясни по подробнее...

Автор: VihaVik 19.11.2007, 12:13
При изменении записи, удалении записи и т.д. TADODataSet посылает команды СКЛ на сервер базы данных. Вот эти команды мне и надо перехватить (Просто записать в лог файл для дальнейшего анализа). Как логировать запросы на выборку я знаю, а вот как перехватить команды по изменению данных я найти не могу. Вот в этом и вопрос. Может кто-то сталкивался с этим?

Автор: pseud 20.11.2007, 11:07
Цитата(VihaVik @  19.11.2007,  12:13 Найти цитируемый пост)
Как логировать запросы на выборку я знаю,


как?

какие условия? прога работает сама по себе и надо перехватывать другой прогой? или ты находишься в этой проге что посылает запросы? тогда:
Код

ShowMessage(ADODataSet1.CommandText);

но видимо я не допонял

Автор: VihaVik 20.11.2007, 16:01
pseud
Цитата

Как логировать запросы на выборку я знаю,



как?


Данный код записывает команды выборки которые идут через ADOConnection в СтрингЛист, а затем,  при закрытии ДатаМодуля я сохраняю весь лог втекстовый файл.
Код


Var
MonitorLog:TStringList;
....

procedure TDatMod.ConnectionBSExecuteComplete(Connection: TADOConnection;
  RecordsAffected: Integer; const Error: Error;
  var EventStatus: TEventStatus; const Command: _Command;
  const Recordset: _Recordset);
begin
  MonitorLog.Add(Command.CommandText);
end;


получается в файле запись
select Id_Zakaz, Nomer_Zakaz, Date_Zakaz, Zakazchik, Data_Vidachi_Zakaz from Zakazi
select * from Zakazchiki
select * from Zakazi where Id_Zakaz = 11
select * from Works
select * from Zakazchiki



Но мне нужно записывать не только команды выборки (SELECT), но и комманды изменения удаления записей, т.е. INSERT, DELETE, UPDATE.
Так что если кто сталкивался с этим, то подскажите, где можно эти команды перехватить?

Автор: pseud 21.11.2007, 11:36
читаем help

Код

Occurs after a command is executed.

TExecuteCompleteEvent = procedure(Connection: TADOConnection; RecordsAffected: Integer; const Error: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset) of object;
property OnExecuteComplete: TExecuteCompleteEvent read FOnExecuteComplete write FOnExecuteComplete;

Description

Write an OnExecuteComplete event handler to take specific action after the ADO connection object has successfully executed a command. The OnExecuteComplete event fires after the corresponding operation (executing an ADO command) has completed execution at the ADO Connection object. Calling the Execute method will lead to this event occurring.

Connection indicates the TADOConnection component executing the ADO command.

RecordsAffected indicated the number of rows in the table that were affected by the execution of the command. For instance, if the command deletes rows in a table, RowsAfftected indicates how many rows were deleted (possibly less than all rows if a WHERE clause is used in the command).

Error is an ADO Error object. See the Microsoft Data Access SDK for more information on using ADO Error objects. The Error parameter is only set if an error occurred during execution of the operation that triggered the event. In this case, the EventStatus parameter will contain the indicating value esErrorsOccured.

The EventStatus value (ADO EventStatusEnum) indicates the success or failure of the execution of the operation that triggered the event.

Command is the ADO Command object executing the command. If no Command object was used, this parameter contains a nil value.

Recordset is an ADO Recordset object containing the result set for the command. Recordset only contains an ADO Recordset object if the command was a SELECT statement, otherwise it contains a nil value.


помоему все понятно, этот метод перехватывает все Execute, а значит все SELECT, INSERT, UPDATE, DELETE и т.д.

Добавлено через 2 минуты и 22 секунды
а еще он возвращает RecordsAffected и мы можем залогировать сколько строк было удалено или изменено 
а еще он возвращает Error и мы можем залогировать что за ошибка произошла при выполнении нашего Execute
вобщем  smile 

Автор: VihaVik 21.11.2007, 13:53
Цитата

 этот метод перехватывает все Execute, а значит все SELECT, INSERT, UPDATE, DELETE и т.д


Этот метод перехватывает только Execute используемые в свойстве CommandText элементов ADO (TADOCommand, TADODataSet, TADOQuery, TADOTable...). По крайней мере в лог заносятся только комманды которые непосредственно устанавливаются в этом свойстве.
Мне же необходимо перехватить комманды которые посылаются при связке DBGrid-DataSource-ADODataset-ADOConnection. Т.Е. при изменении в гриде записей, удалении их и т.д.

По ентому и интересует такой вопрос где в каком месте происходит перевод комманд в СКЛ и посылка их на сервер базы данных? И естественно в каком месте мне их перехватить?


Автор: Akella 21.11.2007, 14:23
а может лучше всего на сервере делать логирование?

Автор: VihaVik 21.11.2007, 14:52
Цитата

а может лучше всего на сервере делать логирование?


Скорее всего это и будет решением. 

В любом случае если нарою решение то сообщю. А пока всем спасибо за ответы.

Автор: Akella 21.11.2007, 15:27
Я не знаю, как с событиями в M$ SQL, просто в огнептице есть удобное средство, называемое треггерами

Автор: VihaVik 21.11.2007, 16:06
Про МС СКЛ не скажу. База у меня под Аксесс. (Под ФБ переделывать ее нет смысла (не те деньги), по крайней мере не на данном этапе, база не моя и программа управления данными тоже не моя). Механизм репликации мне не подходит. Пользователи работают с отключенным набором данных, т.е. с файлами ADTG. Приносят на серверный комп данные. Программа делает публикацию в базе данных с помощью UpdateBatch. Т.е. не мной реализованная и выполненная модель Briefcase. И в этот момент возникает ошибка обновления. Документации по программе - кот наплакал - ни нормальных исходников, ни-че-го... Мне нужно сейчас проконтролировать процесс ввода данных удаленными пользователями, записать их изменения в лог. И попытаться определить где возникает ошибка.  Потому что сама программа пишет - ошибка обновления и усе. У меня покрайней мере есть нормальные исходники удаленного клиента, вот в нем я и хочу запостить логер.
Ну надеюсь я ситуацию в кратце описал.
Под ФБ конечно с этим делом былобы намного легче, но......

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)