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_misc_error

您可以使用此存储过程处理未被分类为数据库错误或通信错误的 dbmlsync 错误。例如,您可以实现 sp_hook_dbmlsync_misc_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 挂接时,可以导致此 _end 挂接执行某些操作(如重试同步)。

注释

如果在启动过程中还没有初始化同步的时候发生了错误,用于 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_misc_error 以记录所有错误消息的类型。

CREATE PROCEDURE sp_hook_dbmlsync_misc_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 命令行引用了一个无效的发布。

dbmlsync -c eng=custdb;uid=DBA;pwd=sql -n test

现在 error_log 表包含以下行,从而将错误与错误 ID 9931 相关联。

1,9931,
 'There is no synchronization subscription to publication "test"'

若要进行自定义错误处理,请检查 sp_hook_dbmlsync_misc_error 中的错误 ID 9931。

ALTER PROCEDURE sp_hook_dbmlsync_misc_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);

 IF id = 9931 THEN
  // handle invalid publication
 END IF;

END;