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

SQL Anywhere 11.0.1 (日本語) » Mobile Link - サーバ管理 » Mobile Link イベント » 同期イベント

 

handle_odbc_error 接続イベント

ODBC ドライバ・マネージャによってトリガされたエラーを Mobile Link サーバが検出すると、実行されます。

パラメータ

次の表の説明では、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)。Mobile Link リモート ID。名前付きパラメータを使用している場合のみ、リモート ID を参照できます。 適用不可
s.username VARCHAR(128)。Mobile Link ユーザ名。 4
s.table VARCHAR(128) 5
デフォルトのアクション

Mobile Link サーバは、デフォルトのアクション・コードを選択します。スクリプト内でアクション・コードを修正し、Mobile Link に次の処理を指示する値を返すことができます。アクション・コード・パラメータには、次のいずれかの値を指定します。

  • 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 の例

次の例は 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
Java の例

次の Mobile Link システム・プロシージャ・コールは、スクリプト・バージョン 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 ); 
}
.NET の例

次の Mobile Link システム・プロシージャ・コールは、スクリプト・バージョン ver1 を同期するときに、HandleODBCError という .NET メソッドを handle_odbc_error イベント用のスクリプトとして登録します。

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 );
}