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

SQL Anywhere 11.0.1 (Deutsch) » MobiLink - Serveradministration » MobiLink-Ereignisse » Synchronisationsereignisse

 

handle_error (Verbindungsereignis)

Wird ausgeführt, wenn der MobiLink-Server auf einen SQL-Fehler stößt.

Parameter

In der folgenden Tabelle stellt die Beschreibung den SQL-Datentyp bereit. Wenn Sie Ihr Skript in Java oder .NET schreiben, müssen Sie den entsprechenden Datentyp benutzen. Weitere Hinweise finden Sie unter SQL-Java-Datentypen und SQL-.NET-Datentypen.

In SQL-Skripten können Sie Ereignisparameter mit ihrem Namen oder mit einem Fragezeichen angeben. Namen und Fragezeichen dürfen jedoch in einem Skript nicht gemischt verwendet werden. Wenn Sie Fragezeichen verwenden, müssen die Parameter in der nachfolgend gezeigten Reihenfolge stehen und sind nur dann optional, wenn keine nachfolgenden Parameter angegeben wurden (z.B. müssen Sie Parameter 1 verwenden, wenn Sie Parameter 2 verwenden möchten). Wenn Sie benannte Parameter verwenden, können Sie beliebige Teilmengen der Parameter in beliebiger Reihenfolge angeben.

Parametername für SQL-Skripten

Beschreibung

Reihenfolge

s.action_code

INTEGER. Dies ist ein INOUT-Parameter.

1

s.error_code

INTEGER

2

s.error_message

TEXT

3

s.remote_id VARCHAR(128). Die entfernte ID von MobiLink. Sie können die entfernte ID nur dann referenzieren, wenn Sie benannte Parameter verwenden. Nicht anwendbar

s.username

VARCHAR(128). Der MobiLink-Benutzername

4

s.table

VARCHAR(128). Wenn das Skript kein Tabellenskript ist, ist der Tabellenname NULL.

5

Standardaktion

Wenn kein handle_error-Skript definiert ist oder dieses Skript einen Fehler verursacht, ist der Standardaktionscode 3000: Aktuelle Transaktion zurücksetzen und aktuelle Synchronisation abbrechen.

Bemerkungen

Der MobiLink-Server sendet im aktuellen Aktionscode. Anfangs ist dieser für jede Gruppe von Fehlern, die durch einen SQL-Vorgang verursacht wurden, auf 3000 festgelegt. Normalerweise tritt pro SQL-Vorgang nur ein Fehler auf, es können jedoch auch mehr sein. Dieses handle_error-Skript wird pro Fehler in einer Gruppe einmal aufgerufen. Der an den ersten Fehler weitergeleitete Aktionscode ist 3000. Nachfolgende Aufrufe werden in den Aktionscode weitergegeben, der vom vorigen Aufruf zurückgegeben wurde. Bei mehreren Aufrufen verwendet MobiLink den nummerisch höchsten Wert.

Sie können den Aktionscode im Skript ändern und einen Wert zurückgeben, der MobiLink anweist, wie weitergearbeitet werden soll. Der Aktionscode vermittelt dem MobiLink-Server, was als Nächstes zu tun ist. Bevor der MobiLink-Server dieses Skript aufruft, setzt er den Aktionscode auf einen Standardwert, der davon abhängt, wie schwerwiegend der Fehler ist. Ihr Skript kann diesen Wert ändern. Ihr Skript muss einen Aktionscode zurückgeben.

Der Aktionscode-Parameter hat einen der folgenden Werte:

  • 1000   Aktuelle Zeile überspringen und Verarbeitung fortsetzen.

  • 3000   Aktuelle Transaktion zurücksetzen und aktuelle Synchronisation abbrechen. Dies ist der Standard-Aktionscode. Er wird verwendet, wenn kein handle_error-Skript definiert ist oder dieses Skript einen Fehler verursacht.

  • 4000   Aktuelle Transaktion zurücksetzen, die Synchronisation abbrechen und den MobiLink-Server herunterfahren.

An Hand des Fehlercodes und der Meldung können Sie die Art des Fehlers bestimmen. Wenn der Fehler als Teil der Synchronisation aufgetreten ist, wird der Benutzername geliefert. Andernfalls ist dieser Wert NULL.

Der MobiLink-Server führt dieses Skript aus, wenn ein ODBC-Fehler auftritt, während MobiLink ein Einfügungs-, Aktualisierungs- oder Lösch-Skript während des Uploads verarbeitet oder Downloadzeilen abruft. Tritt ein ODBC-Fehler zu einem anderen Zeitpunkt auf, ruft der MobiLink-Server das Skript report_error oder report_ODBC_error auf und bricht die Synchronisation ab.

Ist der Fehler aufgetreten, während eine bestimmte Tabelle bearbeitet wurde, wird der Tabellenname geliefert. Andernfalls ist dieser Wert NULL. Der Tabellenname ist der Name einer Tabelle in der Clientanwendung. Dieser Name kann eine direkte Entsprechung in der konsolidierten Datenbank haben, abhängig von der Planung des Synchronisationssystems.

SQL-Skripten für das Ereignis handle_error müssen als gespeicherte Prozedur implementiert werden.

Sie können einen Wert aus dem Skript handle_error folgende Arten zurückgeben.

  • Übergeben Sie den Aktionsparameter an den OUTPUT-Parameter einer Prozedur:

    CALL my_handle_error( {ml s.action_code}, {ml s.error_code}, {ml s.error_message}, {ml s.username}, {ml s.table} )
  • Stellen Sie den Aktionscode über den Rückgabewert einer Prozedur oder einer Funktion ein:

    {ml s.action_code} = CALL my_handle_error( {ml s.error_code}, {ml s.error_message}, {ml s.username}, {ml s.table} )

    Die meisten RDBMS verwenden die RETURN-Anweisung, um den Rückgabewert einer Prozedur oder einer Funktion festzulegen.

Die Beispielanwendung CustDB enthält Fehlerbehandlungsroutinen für verschiedene Datenbank-Managementsysteme.

Siehe auch
SQL-Beispiel

Das folgende Beispiel eignet sich für eine konsolidierte SQL Anywhere-Datenbank. Es gestattet Ihrer Anwendung, redundante Einfügungen zu ignorieren.

Der nachfolgende Aufruf einer MobiLink-Systemprozedur weist die gespeicherte Prozedur ULHandleError dem Ereignis handle_error zu.

CALL ml_add_connection_script(
    'ver1',
    'handle_error',
    'CALL ULHandleError(
      {ml s.action_code}, 
      {ml s.error_code}, 
      {ml s.error_message}, 
      {ml s.username}, 
      {ml s.table} )' )

Die folgende SQL-Anweisung erstellt die gespeicherte Prozedur ULHandleError.

CREATE PROCEDURE ULHandleError(
   INOUT action integer,
   IN error_code integer,
   IN error_message varchar(1000),
   IN user_name varchar(128),
   IN table_name varchar(128) )
BEGIN
  -- -196 is SQLE_INDEX_NOT_UNIQUE
  -- -194 is SQLE_INVALID_FOREIGN_KEY
  IF error_code = -196 or error_code = -194 then
      -- ignore the error and keep going
      SET action = 1000;
  ELSE
      -- abort the synchronization
      SET action = 3000;
  END IF;
END
Java-Beispiel

Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens handleError als das Skript für das Verbindungsereignis handle_error, wenn die Skriptversion ver1 synchronisiert wird.

CALL ml_add_java_connection_script(
    'ver1',
    'handle_error',
    'ExamplePackage.ExampleClass.handleError' )

Im Folgenden sehen Sie die Java-Beispielmethode handleError. Sie verarbeitet einen Fehler basierend auf den Daten, die übergeben werden. Außerdem legt sie den sich daraus ergebenden Fehlercode fest.

public String handleError(
  ianywhere.ml.script.InOutInteger actionCode,
  int errorCode,
  String errorMessage,
  String user,
  String table ) {
  int newAC;
  if( user == null ) {
    newAC = handleNonSyncError( errorCode,
    errorMessage ); }
  else if( table == null ) {
    newAC = handleConnectionError( errorCode,
    errorMessage, user ); }
  else {
    newAC = handleTableError( errorCode,
    errorMessage, user, table ); 
  }
  // Keep the most serious action code.
  if( actionCode.getValue() < newAC ) {
    actionCode.setValue( newAC ); 
  }
}
.NET-Beispiel

Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens HandleError als das Skript für das Verbindungsereignis handle_error, wenn die Skriptversion ver1 synchronisiert wird.

CALL mll_add_dnet_connection_script(
  'ver1',
  'handle_error',
  'TestScripts.Test.HandleError' )

Im Folgenden sehen Sie die .NET-Beispielmethode HandleError.

public string HandleError() (
  ref int actionCode,
  int errorCode,
  string errorMessage,
  string user,
  string table ) {
  int new_ac;
  if( user == null ) {
    new_ac = HandleNonSyncError( errorCode,
    errorMessage ); }
  else if( table == null ) {
    new_ac = HandleConnectionError( errorCode,
    errorMessage, user ); }
  else {
    new_ac = HandleTableError( errorCode,
    errorMessage, user, table ); 
  }
  // Keep the most serious action code.
  if( actionCode < new_ac ) {
    actionCode = new_ac; 
  }
}