Wird ausgeführt, wenn der MobiLink-Server auf einen Fehler stößt, der vom ODBC-Treibermanager ausgelöst wurde.
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.ODBC_state | VARCHAR(5) | 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) | 5 |
Der MobiLink-Server wählt einen standardmäßigen Aktionscode. Sie können den Aktionscode im Skript ändern und einen Wert zurückgeben, der MobiLink anweist, wie weitergearbeitet werden soll. 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.
Der MobiLink-Server führt dieses Skript aus, wenn er auf einen Fehler stößt, der vom ODBC-Treibermanager markiert wurde, während MobiLink ein Einfüge-, Aktualisierungs- oder Löschskript bei der Uploadtransaktion 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.
An Hand des Fehlercodes können Sie die Art des Fehlers feststellen.
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.
Das Skript handle_odbc_error wird nach den Skripten handle_error und report_error und vor dem Skript report_odbc_error aufgerufen.
Wenn nur eines von beiden Fehlerbehandlungsskripten definiert ist, entscheidet der Rückgabewert von diesem Skript über das Fehlerbehandlungsverhalten. Wenn beide Fehlerbehandlungsskripte definiert sind, verwendet der MobiLink-Server den nummerisch höchsten Aktionscode. Wenn sowohl handle_error als auch handle_ODBC_error definiert wurden, verwendet MobiLink den nummerisch höchsten Aktionscode, der von den Aufrufen zurückgegeben wurde.
Das folgende Beispiel eignet sich für eine konsolidierte SQL Anywhere-Datenbank. Damit wird Ihrer Anwendung gestattet, Verletzungen der ODBC-Integrität zu ignorieren.
Der nachfolgende Aufruf einer MobiLink-Systemprozedur weist die gespeicherte Prozedur HandleODBCError dem Ereignis handle_odbc_error zu.
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} )' ) |
Die folgende SQL-Anweisung erstellt die gespeicherte Prozedur 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 |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens handleODBCError als das Skript für das Ereignis handle_odbc_error, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_java_connection_script( 'ver1', 'handle_odbc_error', 'ExamplePackage.ExampleClass.handleODBCError' ) |
Im Folgenden sehen Sie die Java-Beispielmethode handleODBCError. Sie verarbeitet einen Fehler basierend auf den Daten, die übergeben werden. Außerdem legt sie den sich daraus ergebenden Fehlercode fest.
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 ); } |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens HandleODBCError als das Skript für das Ereignis handle_odbc_error, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_dnet_connection_script( 'ver1', 'handle_odbc_error', 'TestScripts.Test.HandleODBCError' ) |
Im Folgenden sehen Sie die .NET-Beispielmethode 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 ); } |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |