在 Build 2.08 中,我们添加了用于注册接收工作区事件的事件处理程序的选项。这可用于监视对工作区的访问,例如将此信息写入日志文件。
有 2 种方法可以安装此事件处理程序:
1.创建实现 DbNotifyEventHandler 委托的函数/方法。
PUBLIC DELEGATE XSharp.DbNotifyEventHandler(osender AS XSharp.RDD.IRDD, e AS XSharp.DBNotifyEventArgs) AS VOID
2.您创建一个实现 IDbnotify 接口的类,该接口只有一个名为 Notify() 的方法,其原型与 1) 中的委托相同。
•如果你不想拖慢整个 RDD 系统的运行速度,那么你的事件处理程序就应该尽量少做一些事情。
•不要在事件处理程序中操作任何工作区,以避免递归。
•尽快取消注册事件处理程序。
•如果您使用对象进行事件处理,您就有责任管理该对象的生命周期。请务必在对象超出范围之前取消注册。
•在某些情况下(对多个工作区进行操作,如 DbCommitAll() 和 DbUnLockAll()),事件处理程序并不总能收到发送者参数。请做好准备!
•事件是从 CoreDb 层发送的。因此,如果 RDD 中的一个方法调用了该 RDD 中的另一个方法(例如,创建 order 后,CreateOrder() 可能会调用 GoTop()),那么您将看不到第二个事件,只能看到与从 CoreDb() 层调用的方法相关的事件,因此在本例中与创建 order 相关的事件。
如果使用方法 1,则需要在 CoreDb.Notify 中添加事件处理程序,如下例所示:
FUNCTION NotifyRDDOperations(oRDD AS XSharp.RDD.IRdd, oEvent AS XSharp.DbNotifyEventArgs) AS VOID
IF oRDD != NULL
? oRDD:Alias, oEvent:Type:ToString(), oEvent:Data
ELSE
? "(no area)",oEvent:Type:ToString(), oEvent:Data
ENDIF
RETURN
FUNCTION Start() AS VOID
CoreDb.Notify += NotifyRDDOperations
? DbCreate("Test", {{"FLD1" , "C" , 10 , 0} }) // 这将触发一个通知
CoreDb.Notify -= NotifyRDDOperations // 请不要忘记取消注册!
WAIT
RETURN
该函数的参数为:
oRDD | 触发事件的 RDD。对于涉及多个工作区的事件,如 DbUnlockAll() ,该值可能为 NULL。 |
oEvent | 一个事件处理程序对象,它有 2 个属性 |
Type DbNotificationType 枚举值 |
Data 包含事件附加信息的对象,如 PieldPut 的字段名和 Append 或 Delete 事件的记录编号。 |
第二种方法是创建一个类,使用 DbRegisterClient() 函数注册该类,然后使用 DbUnRegisterClient 函数取消注册该类。
类中的方法将获得与事件处理函数相同的参数:
CLASS Notifier IMPLEMENTS IDbnotify
METHOD Notify(oRDD AS XSharp.RDD.IRdd, oEvent AS XSharp.DbNotifyEventArgs) AS VOID
IF oRDD != NULL
? oRDD:Alias, oEvent:Type:ToString(), oEvent:Data
ELSE
? "(no area)",oEvent:Type:ToString(), oEvent:Data
ENDIF
RETURN
END CLASS
FUNCTION Start() AS VOID
LOCAL oNot AS Notifier
oNot := Notifier{}
DbRegisterClient(oNot)
? DbCreate("Test", {{"FLD1" , "C" , 10 , 0} }) // 这将触发一个通知
DbUnRegisterClient(oNot) // 请不要忘记取消注册!
WAIT
RETURN
DbNotificationType
DbRegisterClient()
DbUnRegisterClient
DbNotifyEventHandler
IDbnotify