Show/Hide Toolbars

XSharp

 

在 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