Wird ausgeführt, wenn der MobiLink-Server beim Aufrufen eines Datenskripts auf einen SQL-Fehler stößt.
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. Siehe SQL-Java-Datentypen und SQL-.NET-Datentypen.
In SQL-Skripten können Sie Ereignisparameter mit ihrem Namen oder mit einem Fragezeichen angeben. Die Verwendung von Fragezeichen ist veraltet und es wird empfohlen, benannte Parameter zu verwenden. Sie können nicht Namen und Fragezeichen in einem Skript mischen. 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 (veraltet für SQL) |
---|---|---|
s.action_code |
INTEGER. Dies ist ein INOUT-Parameter. Setzen Sie diesen Wert, um den MobiLink-Server anzuweisen, wie er auf den Fehler reagieren soll. |
1 |
s.error_code |
INTEGER. Der native RDBMS-Fehlercode |
2 |
s.error_message |
TEXT. Die native RDBMS-Fehlermeldung. |
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). Die Tabelle, deren Skript den Fehler verursacht hat. Wenn das Skript kein Tabellenskript ist, ist der Tabellenname NULL. |
5 |
Der MobiLink-Server wählt eine Standardaktion. Sie können die Aktion im Skript ändern und einen Wert zurückgeben, der MobiLink anweist, wie fortgefahren werden soll. Der action_code-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.
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. Wenn Zeilen in Batches hochgeladen werden, wird dieses Skript handle_error einmal pro Fehler im Batch aufgerufen. Während derselben Synchronisation wird der Aktionscode 3000 in den ersten Fehler übergeben. Nachfolgende Aufrufe werden in den Aktionscode übergeben, der vom vorigen Aufruf zurückgegeben wurde. Bei mehreren Aufrufen verwendet MobiLink den nummerisch höchsten Wert.
Weitere Hinweise zu Batch-Uploads von Zeilen finden Sie unter mlsrv12-Option -s .
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.
Anhand des Fehlercodes und der Fehlermeldung können Sie die Art des Fehlers bestimmen.
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 verfügt möglicherweise nicht über eine direkte Entsprechung in der konsolidierten Datenbank, je nachdem, wie Ihre entfernten Tabellennamen den konsolidierten Tabellen zugeordnet werden.
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 action_code-Parameter 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 action_code-Parameter ü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.
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 |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens handleError als 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 ); } } |
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 ml_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; } } |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |