TADOConnection.OnExecuteComplete/未使用 TADOTable 调用 OnWillExecute 事件
TADOConnection.OnExecuteComplete / OnWillExecute event not called with TADOTable
我尝试跟踪 SQL 命令。我读了这个 post :How can I monitor the SQL commands send over my ADO connection?
它确实适用于 select 但不适用于 Delete/Insert/Update...
配置:TADOConnection
(MS SQL 服务器)、TADOTable
、TDatasource
、TDBGrid
和 TDBNavigator
。
所以我可以跟踪 table 打开时发生的 SELECT
,但是当我使用 DBNavigator 到 UPDATE
、INSERT
或 DELETE
记录。
当我使用 TADOCommand 删除记录时,它也有效。它似乎只有在我使用 DBNavigator 时才起作用,所以可能是一个线索,但我没有找到任何相关信息。
提前致谢
希望有人能够为您指明 pre-existing 库的方向,该库可以为您进行日志记录。特别是,如果 FireDAC 是一个选项,您可以在这里查看它的内容:
http://docwiki.embarcadero.com/RADStudio/XE8/en/Database_Alerts_%28FireDAC%29
当然,将您的应用程序从使用 Ado 转换为 FireDAC 可能不是您的选择,但根据您的需求,您可以想象提取 FireDAC 使用的 Sql-Server-specific 事件警报方法进入 Ado 应用程序。我刚才简要地研究了一下,看起来相当简单。
在 FireDAC 之前,我实现了一个 server-side 捕获插入、更新和删除的解决方案。大约 10 年前我不得不这样做(对于 Sql Server 2000),它的设置性能非常好。
大体上它是这样工作的:
Sql 服务器支持 MS 过去称为 "extended stored procedures" 的内容,它们是在自定义 DLL 中实现的(这些天 MS 可能使用不同的名称来引用它们,甚至已经停止支持它们)。周围有 Delphi 库提供了一个包装器,使它们能够在 Delphi 中编写。当然,现在如果你的Sql服务器是64位的,你需要生成一个64位的DLL。
您编写扩展存储过程来以您想要的任何方式记录更改,然后在数据库中编写用于插入、更新和删除的自定义触发器,将涉及的行数据提供给您的 XSP。
幸运的是,就在我完成项目时,我对此的需求消失了,在我到达 stress-testing 和 performance-profiling 之前,但它确实有效。
当然,并非在每个环境中,您都会 allowed/able 在 Sql 服务器上安装 s/ware 和触发代码。
感兴趣的话,你也可以看看 https://msdn.microsoft.com/en-us/library/ms162565.aspx,它提供了一个 SMO 对象来跟踪 Sql 服务器 activity,虽然它似乎只有 32 位那一刻。
为了娱乐,我可能会尝试为 TAdoTable/TAdoQuery 下的记录集对象实现 event-handler,它应该能够捕捉到您想要的更改,但没有屏住呼吸...
当然,如果您只对 client-side 日志记录感兴趣,一种方法是为数据集的 AfterEdit、AfterInsert 和 AfterDelete 事件编写处理程序。当然,这些并不能保证更改会实际应用于服务器,但可以提供用户 activity 的准确记录,如果这足以满足您的需要的话。
我尝试跟踪 SQL 命令。我读了这个 post :How can I monitor the SQL commands send over my ADO connection?
它确实适用于 select 但不适用于 Delete/Insert/Update...
配置:TADOConnection
(MS SQL 服务器)、TADOTable
、TDatasource
、TDBGrid
和 TDBNavigator
。
所以我可以跟踪 table 打开时发生的 SELECT
,但是当我使用 DBNavigator 到 UPDATE
、INSERT
或 DELETE
记录。
当我使用 TADOCommand 删除记录时,它也有效。它似乎只有在我使用 DBNavigator 时才起作用,所以可能是一个线索,但我没有找到任何相关信息。
提前致谢
希望有人能够为您指明 pre-existing 库的方向,该库可以为您进行日志记录。特别是,如果 FireDAC 是一个选项,您可以在这里查看它的内容:
http://docwiki.embarcadero.com/RADStudio/XE8/en/Database_Alerts_%28FireDAC%29
当然,将您的应用程序从使用 Ado 转换为 FireDAC 可能不是您的选择,但根据您的需求,您可以想象提取 FireDAC 使用的 Sql-Server-specific 事件警报方法进入 Ado 应用程序。我刚才简要地研究了一下,看起来相当简单。
在 FireDAC 之前,我实现了一个 server-side 捕获插入、更新和删除的解决方案。大约 10 年前我不得不这样做(对于 Sql Server 2000),它的设置性能非常好。
大体上它是这样工作的:
Sql 服务器支持 MS 过去称为 "extended stored procedures" 的内容,它们是在自定义 DLL 中实现的(这些天 MS 可能使用不同的名称来引用它们,甚至已经停止支持它们)。周围有 Delphi 库提供了一个包装器,使它们能够在 Delphi 中编写。当然,现在如果你的Sql服务器是64位的,你需要生成一个64位的DLL。
您编写扩展存储过程来以您想要的任何方式记录更改,然后在数据库中编写用于插入、更新和删除的自定义触发器,将涉及的行数据提供给您的 XSP。
幸运的是,就在我完成项目时,我对此的需求消失了,在我到达 stress-testing 和 performance-profiling 之前,但它确实有效。
当然,并非在每个环境中,您都会 allowed/able 在 Sql 服务器上安装 s/ware 和触发代码。
感兴趣的话,你也可以看看 https://msdn.microsoft.com/en-us/library/ms162565.aspx,它提供了一个 SMO 对象来跟踪 Sql 服务器 activity,虽然它似乎只有 32 位那一刻。
为了娱乐,我可能会尝试为 TAdoTable/TAdoQuery 下的记录集对象实现 event-handler,它应该能够捕捉到您想要的更改,但没有屏住呼吸...
当然,如果您只对 client-side 日志记录感兴趣,一种方法是为数据集的 AfterEdit、AfterInsert 和 AfterDelete 事件编写处理程序。当然,这些并不能保证更改会实际应用于服务器,但可以提供用户 activity 的准确记录,如果这足以满足您的需要的话。