Есть ли способ узнать, кто вызвал событие OnExecuteComplete TADOConnection?

Я пытаюсь написать профилировщик базы данных ADO в Delphi 7. Это часть проекта Delphi.

я использую OnExecuteComplete событие, но на некоторых компьютерах я получаю "MSADO15.DLL" Ошибка нарушения доступа.

Я исследовал и недооцениваю некоторую версию win, которая несовместима, повреждена или имеет другую версию.

что ошибка AV произошла, когда я использую parameters[i].value свойство "Command".. тогда я решаю написать другой тип, теперь мне нужна ссылка на объект, который вызвал OnExecuteComplete событие в ADOConnection. если я смогу достичь этого, проблема будет решена.

я использую ссылки "Command" и "Recordset" для сравнения всеми объектами ADO, которые связаны этим ADOConnection, но некоторые объекты ADO не имеют Recordset... есть ли способ узнать, кто вызвал это событие? как отправитель?

4 ответа

Решение

Я решаю это! я пишу 2 классы от ADOQuery и ADOStoredProc. Затем я публикую свойство Command из них. принудительно преобразовав StoredProcedure в новый класс, я добираюсь до команды prop и сравниваю это с помощью командного объекта события! задача решена! Спасибо вам всем.

Только WindowsXP,Windows 2003 имеет проблему с "MSADO15.DLL" Ошибка нарушения доступа после чтения параметров [i]. Значение и показ набора записей. Windows7 не имеет этой проблемы. Используйте событие WillExecute - оно отлично работает везде. В ExecuteComplete вы можете получить recordsActed из набора записей (вариант RecordsActed работает неправильно). Вы можете получить Parameters[i].Value позже, если Сохранить параметры в переменную Variant и прочитать его после того, как визуальные компоненты показывают набор записей - используйте OnButtonClick, например, или событие Timer. Эта ошибка не исправлена ​​на всех версиях Delphi - и в DelphiXE2 тоже..

Я не мог разобрать, если вы в.Net или нет, но в.Net это легко. Используйте System.Diagnostics.StackTrace, чтобы увидеть весь стек вызовов, которые ведут к вашему событию.

Для нативного кода, вероятно, также будет способ получить трассировку стека, если вы компилируете в режиме отладки. Прошло довольно много времени с тех пор, как я написал код Delphi (или Pascal). Вы также можете попробовать профилирование с помощью бесплатного стандарта AQTime, который хорошо работает с Delphi (как нативным, так и.Net), который также имеет функцию графа вызовов.

Отправитель должен дать вам подсказку, если это не ноль. Приведите его к TComponent и используйте его свойство Name, чтобы узнать, какой компонент его запустил:

ShowMessage((Sender as TComponent).Name);

Если Sender равен nil, трассировка стека может помочь.

Обновить

По-видимому, здесь нет параметра Sender. В этом случае Connection должен быть классом, который его запускает, поэтому получите его имя и другие данные. Вы получаете достаточно параметров, чтобы узнать, что происходит.

Другие вопросы по тегам