每当 MobiLink 服务器遇到由 ODBC 驱动程序管理器触发的错误时都会执行。
在下表中,说明部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见SQL-Java 数据类型和SQL-.NET 数据类型。
在 SQL 脚本中,可以使用名称或问号指定事件参数,但不能在一个脚本中混合使用名称和问号。如果使用问号,则参数必须按照如下所示的顺序并且仅当没有指定任何后继参数时才是可选的(例如,如果您想使用参数 2,则必须使用参数 1)。如果使用命名参数,则可以按照任何顺序指定任意参数子集。
SQL 脚本的参数名称 | 说明 | 顺序 |
---|---|---|
s.action_code | INTEGER。这是一个 INOUT 参数。 | 1 |
s.ODBC_state | VARCHAR(5) | 2 |
s.error_message | TEXT | 3 |
s.remote_id | VARCHAR(128)。MobiLink 远程 ID。只有在使用命名参数时才能引用远程 ID。 | 不适用 |
s.username | VARCHAR(128)。MobiLink 用户名。 | 4 |
s.table | VARCHAR(128) | 5 |
MobiLink 服务器选择缺省操作代码。您可以修改脚本中的操作代码并返回一个值以指示 MobiLink 如何继续。操作代码参数可以使用以下值:
1000 跳过当前行并继续执行。
3000 回退当前事务并取消当前同步。这是缺省操作代码,在未定义 handle_error 脚本或此脚本导致错误时使用此代码。
4000 回退当前事务,取消同步并关闭 MobiLink 服务器。
当 MobiLink 在上载事务期间处理插入、更新或删除脚本时或当 MobiLink 读取下载行时,如果发生 ODBC 驱动程序管理器标记的错误,则 MobiLink 服务器一遇到该错误就会执行此脚本。如果 ODBC 错误在其它时间发生,则 MobiLink 服务器调用 report_error 或 report_ODBC_error 脚本并中止同步。
错误代码可用于标识错误的性质。
操作代码将告知 MobiLink 服务器如何继续。在调用此脚本之前,MobiLink 服务器将操作代码设置为缺省值,该缺省值的大小取决于错误的严重程度。您可以使用脚本修改此值。脚本必须返回或设置一个操作代码。
handle_odbc_error 脚本在 handle_error 和 report_error 脚本之后、report_odbc_error 脚本之前调用。
如果只定义了一个(而非两个)error-handling 脚本,则该脚本的返回值将决定错误行为。如果定义了两个 error-handling 脚本,则 MobiLink 服务器将使用数值最大的操作代码。如果同时定义了 handle_error 和 handle_ODBC_error,则 MobiLink 将使用所有的调用所返回的最大数值的操作代码。
以下示例在 SQL Anywhere 统一数据库中运行。它允许应用程序忽略 ODBC 完整性约束违规。
以下对 MobiLink 系统过程的调用将 HandleODBCError 存储过程指派给 handle_odbc_error 事件。
CALL ml_add_connection_script( 'ver1', 'handle_odbc_error', 'CALL HandleODBCError( {ml s.action_code}, {ml s.ODBC_state}, {ml s.error_message}, {ml s.username}, {ml s.table} )' ) |
以下 SQL 语句创建 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 |
以下对 MobiLink 系统过程的调用在同步脚本版本 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 newAC; if( user == null ) { newAC = handleNonSyncError( ODBCState, errorMessage ); } else if( table == null ) { newAC = handleConnectionError( ODBCState, errorMessage, user ); } else { newAC = handleTableError( ODBCState, errorMessage, user, table ); } // Keep the most serious action code. if( actionCode.getValue() < newAC ) { actionCode.setValue( newAC ); } return( null ); } |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 HandleODBCError 的 .NET 方法注册为 handle_odbc_event 的脚本。
CALL ml_add_dnet_connection_script( 'ver1', 'handle_odbc_error', 'TestScripts.Test.HandleODBCError' ) |
以下是 .NET 方法 HandleODBCError 示例。
public string HandleODBCError ( ref int 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 < new_ac ) { actionCode = new_ac; } return( null ); } |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |