Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » MobiLink - 客户端管理 » 用于 MobiLink 的 SQL Anywhere 客户端 » SQL Anywhere 客户端的事件挂接

 

sp_hook_dbmlsync_all_error

您可以使用此存储过程处理所有类型的 dbmlsync 错误消息。例如,您可以实现 sp_hook_dbmlsync_all_error 挂接,从而在发生特定错误时记录错误或执行特定操作。

#hook_dict 表中各行

名称

说明

publication_n (in)

发布

正被同步的发布,其中 n 是一个整数。每个正在上载的发布都有一个 publication_n 条目。n 的编号从零开始。

MobiLink user (in)

MobiLink 用户名

您正在为其进行同步的 MobiLink 用户。

script version (in)

脚本版本名

用于同步的 MobiLink 脚本版本。

error message (in) 错误消息文本 这与在 dbmlsync 日志中显示的文本相同。
error id (in) 整数 唯一标识消息的 ID。使用此行来标识错误消息,因为错误消息文本可能发生变化。
error hook user state (in|out) 整数

此值可由挂接设置,以便将状态信息传递到对 sp_hook_dbmlsync_all_error、sp_hook_dbmlsync_communication_error、sp_hook_dbmlsync_misc_error、sp_hook_dbmlsync_sql_error 或 sp_hook_dbmlsync_end 挂接的未来调用。第一次调用这些挂接的其中之一时,该行的值为 0。如果挂接更改了行值,则将在下一个挂接调用中使用新值。

使用此挂接将状态信息传递给 sp_hook_dbmlsync_end 挂接时,可以导致 sp_hook_dbmlsync_end 挂接执行某些操作(如重试同步)。

注释

每次生成 dbmlsync 错误消息时,都将调用以下挂接:

  • 首先,根据错误的类型,将调用以下的挂接之一:sp_hook_dbmlsync_communication_error、sp_hook_dbmlsync_misc_error 或 sp_hook_dbmlsync_sql_error。这些挂接包含错误类型的特定信息;例如,针对 SQL 错误提供的 sqlcode 和 sqlstate。

  • 其次,调用 sp_hook_dbmlsync_all_error。此挂接对于记录所有已发生的错误非常有用。

如果在启动过程中还没有初始化同步的时候发生了错误,用于 Mobilink 用户和脚本版本的 #hook_dict 条目将被设置为一个空字符串,并且在 #hook_dict 表中不设置 publication_n 行。

此过程将在单独的连接上执行以确保它执行的操作不会在同步连接执行回退时丢失。如果 dbmlsync 无法建立单独的连接,则不调用该过程。

缺省情况下,在 Windows Mobile 设备上,同步表以独占模式被锁定,这意味着如果此挂接需要访问任何同步表,它就不能成功执行。如果它需要访问同步表而您将 dbmlsync 扩展选项 LockTables 设置为 EXCLUSIVE,则它也无法执行。请参见LockTables (lt) 扩展选项

此过程的操作将在挂接完成后立即被提交。

另请参见
示例

假定您使用下表记录远程数据库中的错误。

CREATE TABLE error_log
(
 pk INTEGER DEFAULT AUTOINCREMENT PRIMARY KEY,
 err_id INTEGER,
 err_msg VARCHAR(10240),
);

以下示例设置 sp_hook_dbmlsync_all_error 以记录错误。

CREATE PROCEDURE sp_hook_dbmlsync_all_error()
BEGIN
 DECLARE msg VARCHAR(10240);
 DECLARE id INTEGER;

 // get the error message text
 SELECT value INTO msg
  FROM #hook_dict
  WHERE name ='error message';

 // get the error id
 SELECT value INTO id
  FROM #hook_dict
  WHERE name = 'error id';

 // log the error information
 INSERT INTO error_log(err_msg, err_id)
  VALUES (msg, id);
END;

要查看可能存在的错误 ID 值,可测试运行 dbmlsync。例如,如果 dbmlsync 返回错误 [无法连接到 MobiLink 服务器],sp_hook_dbmlsync_all_error 将在 error_log 中插入以下的行。

1,14173,
 'Unable to connect to MobiLink server'

现在,您就可以将错误 "无法连接到 MobiLink 服务器" 同错误 ID 14173 相关联。

以下的示例设置挂接,以便在每当发生错误 14173 时,都能够重试该同步。

CREATE PROCEDURE sp_hook_dbmlsync_all_error()
BEGIN
 IF EXISTS( SELECT value FROM #hook_dict 
    WHERE name = 'error id' AND value = '14173' )
 THEN
    UPDATE #hook_dict SET value = '1' 
       WHERE name = 'error hook user state';
   END IF;
END;

CREATE PROCEDURE sp_hook_dbmlsync_end()
BEGIN
 IF EXISTS( SELECT value FROM #hook_dict 
    WHERE name='error hook user state' AND value='1')
 THEN
    UPDATE #hook_dict SET value = 'sync' 
       WHERE name='restart';
   END IF;
END;

请参见sp_hook_dbmlsync_end