Collection Contents 上一页 下一页 PDF

MobiLink 管理指南

同步事件

handle_error 连接事件


功能 

每当 MobiLink 同步服务器遇到 SQL 错误时执行。

参数 

在下表中,[说明] 部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见 SQL-Java 数据类型SQL-.NET 数据类型

只有当未指定任何后续参数时,事件参数才是可选的。例如,如果要使用参数 2,您必须使用参数 1。

参数 说明
1 action_code INTEGER。这是一个 INOUT 参数。
2 error_code INTEGER
3 error_message TEXT
4 ml_username VARCHAR(128)
5 table VARCHAR(128)。如果脚本不是表脚本,则表名为 NULL。
缺省操作 

如果未定义 handle_error 脚本或此脚本导致错误,则缺省动作代码是 3000:回退当前事务并取消当前同步。

说明 

MobiLink 同步服务器在当前的动作代码 (action_code) 中发送。最初,对于每一组由一个单独的 SQL 操作引起的错误,该值都设置为 3000。通常情况下,每个 SQL 操作只会出现一个错误,但也可能出现多个。在一组错误中每出现一次错误时都会调用一次 handle_error 脚本。传递到第一个错误的动作代码是 3000,后续调用是在前一次调用所返回的动作代码中传递的。MobiLink 将使用多个调用所返回的值中的最大值。

您可以修改脚本中的动作代码并返回一个值以指示 MobiLink 如何继续。动作代码参数可以使用以下数值:

handle_error 事件的 SQL 脚本必须作为存储过程执行。

每当 MobiLink 同步服务器在同步过程中遇到错误时都执行该脚本。错误代码和消息可用于标识错误的性质。如果错误是作为同步的一部分发生的,则提供用户名。否则该值为空。

如果在操作某一特定表时发生错误,则提供表名称。否则该值为空。表名称是客户端应用程序中表的名称。该名称在统一数据库中是否存在直接对应的名称取决于同步系统的设计。

动作代码将告知 MobiLink 同步服务器下一步该做什么。在调用此脚本之前,MobiLink 同步服务器将动作代码设置为缺省值,该缺省值的大小取决于错误的严重程度。您可以使用脚本修改该值。脚本必须返回或设置一个动作代码。

handle_error 脚本返回值的方法有两种。

CustDB 示例应用程序中包含用于各种数据库管理系统的错误处理程序。

另请参见 
SQL 示例 

下面的示例在 Adaptive Server Anywhere 统一数据库中运行。它允许您的应用程序忽略冗余插入。

call ml_add_connection_script(
    'ver1',
    'handle_error',
   'call ULHandleError(?,?,?,?,?)' )
CREATE PROCEDURE ULHandleError(
   INOUT action integer,
   IN error_code integer,
   IN error_message varchar(1000),
   IN user_name varchar(128),
   IN table_name varchar(128) )
BEGIN
  -- -196 is SQLE_INDEX_NOT_UNIQUE
  -- -194 is SQLE_INVALID_FOREIGN_KEY
  if error_code = -196 or error_code = -194 then
      -- ignore the error and keep going
      SET action = 1000;
  else
      -- abort the synchronization
      SET action = 3000;
  end if;
END
Java 示例 

下面的存储过程调用在同步脚本版本 ver1 时将名为 handleError 的 Java 方法注册为 handle_error 连接事件的脚本。

call ml_add_java_connection_script(
    'ver1',
    'handle_error',
    'ExamplePackage.ExampleClass.handleError' )

下面是示例 Java 方法 handleError。它根据传入的数据处理错误。同时还确定结果错误代码。

public String handleError(
  ianywhere.ml.script.InOutInteger actionCode,
  int errorCode,
  String errorMessage,
  String    user,
  String  table )
{  int new_ac;
   if( user == null )
   {  new_ac = handleNonSyncError( errorCode,
      errorMessage ); }
   else if( table == null )
   {  new_ac = handleConnectionError( errorCode,
      errorMessage, user ); }
   else
   {  new_ac = handleTableError( errorCode,
      errorMessage, user, table ); }
   // keep the most serious action code
   if( actionCode.getValue() < new_ac )
   {  actionCode.setValue( new_ac ); }
   return( null ); }

Collection Contents 上一页 下一页 PDF