Mobile Link サーバーでデータスクリプトの呼び出し中に ODBC エラーが発生したときに実行されます。
次の表の説明では、SQL データ型を示します。Java または .NET でスクリプトを作成する場合、適切な対応するデータ型を使用する必要があります。 SQL データ型と Java データ型とSQL データ型と .NET データ型を参照してください。
SQL スクリプトでは、名前または疑問符を使用してイベントパラメーターを指定できます。疑問符の使用は推奨されなくなりました。名前付きパラメーターを使用することをおすすめします。1 つのスクリプト内で名前と疑問符を混在させることはできません。疑問符を使用する場合、パラメーターは以下に示す順に指定する必要があり、後続のパラメーターが指定されていない場合のみ省略可能です (たとえば、パラメーター 2 を使用する場合は、パラメーター 1 を使用してください)。名前付きパラメーターを使用する場合は、パラメーターの任意のサブセットを任意の順に指定できます。
SQL スクリプトのパラメーター名 | 説明 | 順序 (SQL では非推奨) |
---|---|---|
s.action_code | INTEGER。これは INOUT パラメーターです。この値は、Mobile Link サーバーにエラーへの対処方法を指示するために設定します。 | 1 |
s.odbc_state | VARCHAR(5)。ODBC SQLSTATE。 | 2 |
s.error_message | TEXT。ODBC エラーメッセージ。 | 3 |
s.remote_id | VARCHAR(128)。Mobile Link リモート ID。名前付きパラメーターを使用している場合のみ、リモート ID を参照できます。 | 適用不可 |
s.username | VARCHAR(128)。Mobile Link ユーザー名。 | 4 |
s.table | VARCHAR(128)。テーブル名。 | 5 |
Mobile Link サーバーは、デフォルトのアクションを選択します。スクリプト内でアクションを修正し、Mobile Link に次の処理を指示する値を返すことができます。action_code パラメーターには、次のいずれかの値を指定します。
1000 現在のローをスキップして、処理を続行します。
3000 現在のトランザクションをロールバックし、現在の同期をキャンセルします。これはデフォルトアクションコードで、handle_error スクリプトが定義されない場合、またはこのスクリプトが原因でエラーが発生した場合に使用されます。
4000 現在のトランザクションのロールバック、同期のキャンセル、Mobile Link サーバーの停止を行います。
Mobile Link がアップロードトランザクション中に挿入、更新、または削除スクリプトを処理している間、またはダウンロードローをフェッチしている間に発生し、ODBC ドライバーマネージャーによってフラグが設定されたエラーを検出した場合、Mobile Link サーバーはこのスクリプトを実行します。別のときに ODBC エラーが発生した場合、Mobile Link サーバーは report_error または report_ODBC_error スクリプトを呼び出して、同期をアボートします。
エラーの内容は、エラーコードで識別できます。
Mobile Link サーバーが次に何を行うかは、アクションコードに示されます。Mobile Link サーバーは、エラーの重大度に応じてアクションコードにデフォルト値を設定してから、このスクリプトを呼び出します。この値は、スクリプトで変更できます。スクリプトは、必ずアクションコードを返すか設定するようにします。
handle_odbc_error スクリプトは、handle_error スクリプトと report_error スクリプトの後、report_odbc_error スクリプトの前に呼び出されます。
エラー処理スクリプトがどちらか 1 つだけ定義されている場合、そのスクリプトからの戻り値によってエラー処理が決定されます。エラー処理スクリプトが両方とも定義されている場合、Mobile Link サーバーは数値の一番大きいアクションコードを使用します。handle_error と handle_ODBC_error の両方が定義されると、Mobile Link はすべての呼び出しから返されるアクションコードのうち、最も大きい番号を持つものを使用します。
次の例は SQL Anywhere 統合データベースで動作します。これによって、アプリケーションは ODBC 整合性制約違反を無視できます。
次の Mobile Link システムプロシージャーコールは、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 |
次の Mobile Link システムプロシージャーコールは、スクリプトバージョン ver1 を同期するときに、handleODBCError という Java メソッドを handle_odbc_error イベント用のスクリプトとして登録します。
CALL ml_add_java_connection_script( 'ver1', 'handle_odbc_error', 'ExamplePackage.ExampleClass.handleODBCError' ) |
次に示すのは、サンプルの Java メソッド handleODBCError です。このメソッドは、渡されたデータに基づいてエラーを処理します。また、エラーの結果生じるエラーコードも判別します。
package ExamplePackage; public class ExampleClass { public void handleODBCError( ianywhere.ml.script.InOutInteger actionCode, String oDBCState, String errorMessage, String user, String table ) { if( oDBCState == "23000" ) { // Ignore the error and keep going. actionCode.setValue( 1000 ); } else { // Abort the synchronization. actionCode.setValue( 3000 ); } } } |
次の Mobile Link システムプロシージャーコールは、スクリプトバージョン ver1 を同期するときに、HandleODBCError という .NET メソッドを handle_odbc_error イベント用のスクリプトとして登録します。
CALL ml_add_dnet_connection_script( 'ver1', 'handle_odbc_error', 'TestScripts.Test.HandleODBCError' ) |
次に示すのは、サンプルの .NET メソッド HandleODBCError です。
namespace TestScripts { public class Test { public void HandleODBCError( ref int actionCode, string oDBCState, string errorMessage, string user, string table ) { if( oDBCState == "23000" ) { // Ignore the error and keep going. actionCode = 1000; } else { // Abort the synchronization. actionCode = 3000; } } } } |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |