Есть ли способ узнать, кто вызвал событие 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 должен быть классом, который его запускает, поэтому получите его имя и другие данные. Вы получаете достаточно параметров, чтобы узнать, что происходит.