每当 MobiLink 同步服务器遇到由 ODBC 驱动程序管理器触发的错误时都执行该事件。
在下表中,[说明] 部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见 SQL-Java 数据类型和 SQL-.NET 数据类型。
只有当未指定任何后续参数时,事件参数才是可选的。例如,如果要使用参数 2,您必须使用参数 1。
| 项 | 参数 | 说明 |
|---|---|---|
| 1 | action_code | INTEGER。这是一个 INOUT 参数。 |
| 2 | ODBC_state | VARCHAR(5) |
| 3 | error_message | TEXT |
| 4 | ml_username | VARCHAR(128) |
| 5 | table | VARCHAR(128) |
MobiLink 同步服务器选择缺省动作代码。您可以修改脚本中的动作代码并返回一个值以指示 MobiLink 如何继续。动作代码参数可以使用以下数值:
1000 跳过当前行并继续执行。
3000 回退当前事务并取消当前同步。这是缺省动作代码,在未定义 handle_error 脚本或此脚本导致错误时将使用此代码。
4000 回退当前事务,取消同步并关闭 MobiLink 同步服务器。
每当 MobiLink 同步服务器在同步过程中遇到由 ODBC 驱动程序管理器标志的错误时都执行该脚本。错误代码可用于标识错误的性质。
动作代码将告知 MobiLink 同步服务器下一步该做什么。在调用此脚本之前,MobiLink 同步服务器将动作代码设置为缺省值,该缺省值的大小取决于错误的严重程度。您可以使用脚本修改该值。脚本必须返回或设置一个动作代码。
handle_odbc_error 脚本在 handle_error 和 report_error 脚本之后、report_odbc_error 脚本之前调用。
如果只定义了一个(而非两个)error-handling 脚本,则该脚本的返回值将决定错误行为。如果定义了两个 error-handling 脚本,则 MobiLink 同步服务器将使用最大的动作代码。如果同时定义了 handle_error 和 handle_ODBC_error,则 MobiLink 将使用所有的调用所返回的动作代码中的最大值。
下面的示例在 Adaptive Server Anywhere 统一数据库中运行。它允许应用程序忽略 ODBC 完整性约束违规。
call ml_add_connection_script(
'ver1',
'handle_odbc_error',
'call HandleODBCError( ?, ?, ?, ?, ? )' )
CREATE PROCEDURE HandleODBCError( INOUT action integer,
IN odbc_state varchar(5), IN error_message varchar(1000),
IN user_name varchar(128), IN table_name varchar(128) )
BEGIN
if odbc_state = '23000' then
-- ignore the error and keep going
SET action = 1000;
else
-- abort the synchronization
SET action = 3000;
end if;
END下面的存储过程调用在同步脚本版本 ver1 时将名为 handleODBCError 的 Java 方法注册为 handle_odbc_error 事件的脚本。
call ml_add_java_connection_script( 'ver1', 'handle_odbc_error', 'ExamplePackage.ExampleClass.handleODBCError' )
下面是示例 Java 方法 handleODBCError。它根据传入的数据处理错误。同时还确定结果错误代码。
public String handleODBCError(
ianywhere.ml.script.InOutInteger actionCode,
String ODBCState,
String errorMessage,
String user,
String table )
{ int new_ac;
if( user == null )
{ new_ac = handleNonSyncError( ODBCState,
errorMessage ); } else if( table == null )
{ new_ac = handleConnectionError( ODBCState,
errorMessage, user ); }
else { new_ac = handleTableError( ODBCState,
errorMessage, user, table ); }
// keep the most serious action code
if( actionCode.getValue() < new_ac )
{ actionCode.setValue( new_ac ); }
return( null ); }SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。