Mit diesem Skript können Sie Fehler protokollieren und die vom handle_error-Skript ausgewählten Aktionen aufzeichnen.
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 verwenden. 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 unten gezeigten Reihenfolge stehen und sind nur dann optional, wenn keine nachfolgenden Parameter angegeben wurden. (Sie müssen beispielsweise 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. Dieser Parameter ist obligatorisch. |
1 |
s.error_code |
INTEGER. Der native DBMS-Fehlercode |
2 |
s.error_message |
TEXT. Die native DBMS-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. |
5 |
s.script_version | VARCHAR(128). Optionaler IN-Parameter, mit dem angegeben wird, dass der MobiLink-Server die bei der aktuellen Synchronisation verwendete Skriptversionszeichenfolge an diesen Parameter übergibt. Fragezeichen können nicht verwendet werden, um diesen Parameter anzugeben. | Nicht anwendbar |
Keine.
Mit diesem Skript können Sie Fehler protokollieren und die vom handle_error-Skript ausgewählten Aktionen aufzeichnen. Dieses Skript wird nach dem Ereignis handle_error ausgeführt, unabhängig davon, ob ein handle_error-Skript definiert wurde. Es wird immer in einer eigenen Transaktion und in einer anderen Datenbankverbindung ausgeführt als die Synchronisationsverbindung (Verwaltungs- bzw. Informationsverbindung).
Der MobiLink-Server gibt immer eine Fehlermeldung aus, wenn der Fehler wiederhergestellt werden kann und der MobiLink-Server den Aufruf des Skripts handle_error oder handle_odbc_error plant. Wenn zum Beispiel ein Fehler auftritt, während der MobiLink-Server versucht, eine Einfügung hochzuladen, meldet der MobiLink-Server diesen Fehler und ruft das Skript handle_error auf. Wenn das Skript handle_error den Aktionscode 1000 zurückgibt, ignoriert der Server den Fehler und fährt mit der Synchronisation fort. Wenn der MobiLink-Server jedoch vor dem Senden an die konsolidierte Datenbank einen Fehler erkennt, meldet der Server den Fehler möglicherweise nicht, weil der Fehler nicht wiederherstellbar ist. Genauer gesagt, meldet der MobiLink-Server die generierten Fehler, die vom ODBC-Treiber und von der konsolidierten Datenbank generiert wurden.
Anhand des Fehlercodes und der Fehlermeldung können Sie die Art des Fehlers bestimmen. Dies ist der vom letzten Aufruf eines Fehlerbehandlungsskripts zurückgegebene Aktionscodewert für den SQL-Vorgang, der den aktuellen Fehler verursacht hat.
Wenn der Fehler als Teil der Synchronisation aufgetreten ist, wird der Benutzername geliefert. Andernfalls ist dieser Wert NULL.
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 entfernten Datenbank. Dieser Name verfügt möglicherweise nicht über eine direkte Entsprechung in der konsolidierten Datenbank, je nachdem, wie Ihre entfernten Tabellennamen den Tabellennamen der konsolidierten Datenbank zugeordnet werden.
Das folgende Beispiel eignet sich für eine konsolidierte SQL Anywhere-Datenbank. Es fügt eine Zeile in eine Tabelle ein, um Synchronisationsfehler aufzuzeichnen.
CALL ml_add_connection_script( 'ver1', 'report_error', 'INSERT INTO sync_error( action_code, error_code, error_message, user_name, table_name ) VALUES ( {ml s.action_code}, {ml s.error_code}, {ml s.error_message}, {ml s.username}, {ml s.table} )' ) |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens reportError als das Skript für das Verbindungsereignis report_error, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_java_connection_script( 'ver1', 'report_error', 'ExamplePackage.ExampleClass.reportError' ) |
Im Folgenden sehen Sie die Java-Beispielmethode reportError. Sie protokolliert den Fehler in einer Tabelle über die JDBC-Verbindung, die von MobiLink bereitgestellt wird. Sie setzt auch den Aktionscode.
package ExamplePackage; import java.sql.*; import ianywhere.ml.script.*; public class ExampleClass { DBConnectionContext _cc; public ExampleClass( DBConnectionContext cc ) { _cc = cc; } public void reportError( ianywhere.ml.script.InOutInteger actionCode, int errorCode, String errorMessage, String user, String table ) throws SQLException { actionCode.setValue( errorCode ); // Insert error information in a table, Connection conn = _cc.getConnection(); PreparedStatement stmt = conn.prepareStatement( "INSERT INTO sync_error( action_code, error_code, error_message, " + "user_name, table_name ) VALUES ( ?, ?, ?, ?, ? )" ); stmt.setInt( 1, actionCode.getValue() ); stmt.setInt( 2, errorCode ); stmt.setString( 3, errorMessage ); stmt.setString( 4, user ); stmt.setString( 5, table ); stmt.executeUpdate(); stmt.close(); } } |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens ReportError als das Skript für das Verbindungsereignis report_error, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_dnet_connection_script( 'ver1', 'report_error', 'TestScripts.Test.ReportError' ) |
Im Folgenden sehen Sie die .NET-Beispielmethode ReportError. Sie protokolliert unter Verwendung einer .NET-Methode den Fehler in einer Tabelle.
using System; using iAnywhere.MobiLink.Script; namespace TestScripts { public class Test { DBConnectionContext _cc; public Test( DBConnectionContext cc ) { _cc = cc; } public void ReportError( ref int actionCode, int errorCode, string errorMessage, string user, string table ) { actionCode = errorCode; DBConnection conn = _cc.GetConnection(); DBCommand cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO sync_error( action_code, error_code, error_message, " + "user_name, table_name ) VALUES ( ?, ?, ?, ?, ? )"; cmd.Parameters[0] = actionCode; cmd.Parameters[1] = errorCode; cmd.Parameters[2] = errorMessage; cmd.Parameters[3] = user; cmd.Parameters[4] = table; cmd.ExecuteNonQuery(); } } } |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |