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

 

download_cursor (Tabellenereignis)

Definiert einen Cursor, um Zeilen auszuwählen, die in der entfernten Datenbank eingefügt oder aktualisiert werden sollen.

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.last_table_download

TIMESTAMP. Zeitpunkt des letzten Downloads der Tabelle.

1

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

2

Standardaktion

Keine.

Bemerkungen

Der MobiLink-Server öffnet einen schreibgeschützten Cursor, mit dem eine Liste von Zeilen abgerufen wird, die an die entfernte Datenbank übertragen werden sollen. Dieses Skript muss eine geeignete SELECT-Anweisung enthalten.

Sie können für jede Tabelle in der entfernten Datenbank ein download_cursor-Skript benutzen.

Um die Performance bei der Downloadphase der Synchronisation auf UltraLite-Clients zu optimieren, wenn der Bereich der Primärschlüsselwerte außerhalb der aktuellen Zeilen auf dem Device liegt, sollten Sie die Zeilen im Download-Cursor nach dem Primärschlüssel sortieren. Von dieser Optimierung können z.B. Download-Vorgänge von großen Referenztabellen profitieren.

Jedes download_cursor-Skript muss eine SELECT-Anweisung oder einen Prozeduraufruf mit einer SELECT-Anweisung enthalten. Der MobiLink-Server verwendet diese Anweisung, um einen Cursor in der konsolidierten Datenbank zu definieren.

Das Skript muss alle Spalten auswählen, die mit den Spalten in der entsprechenden Tabelle der entfernten Datenbank übereinstimmen. Die Spalten in der konsolidierten Datenbank können andere Namen haben als die entsprechenden Spalten in der entfernten Datenbank. Ihre Datentypen müssen jedoch kompatibel sein.

Die Spalten müssen in der Reihenfolge ausgewählt werden, in der die entsprechenden Spalten in der entfernten Datenbank definiert sind.

Beachten Sie, dass download_cursor kaskadierende Löschungen ermöglicht. Sie können also Datensätze aus einer Datenbank löschen.

Um den Download unnötiger Zeilen zu vermeiden, sollten Sie die nachfolgende Zeile in die WHERE-Klausel Ihres download_cursor-Skripts aufnehmen:

AND last_table_download > '1900/1/1'

Für Java- und .NET-Anwendungen muss dieses Skript gültigen SQL-Code zurückgeben.

Wenn Sie READPAST-Tabellen-Hints in download_cursor-Skripten verwenden möchten, da Sie viele Aktualisierungen ausführen, die die Download-Leistung beeinträchtigen, sollten Sie für Downloads stattdessen die Snapshot-Isolation verwenden. Der READPAST-Tabellen-Hint kann Probleme verursachen, wenn er in download_cursor-Skripten verwendet wird. Bei der Verwendung von zeitstempelbasierten Downloads kann der READPAST-Hint dazu führen, dass Zeilen fehlen und dass kein Download einer Zeile in eine entfernte Datenbank möglich ist. Zum Beispiel:

  • Eine Zeile wird der konsolidierten Datenbank hinzugefügt und festgeschrieben. Die Zeile enthält eine last_modified-Spalte mit einer Zeitangabe des vorhergehenden Tags.

  • Dieselbe Zeile wird zwar aktualisiert, aber nicht festgeschrieben.

  • Eine entfernte Datenbank mit einer last_download-Uhrzeit der letzten Woche wird synchronisiert.

  • Ein download_cursor-Skript versucht, die Zeile unter Verwendung von READPAST auszuwählen, und überspringt die Zeile.

  • Die Transaktion, die die Zeile aktualisiert hat, wird zurückgesetzt. Die nächste Zeit des letzten Downloads für die entfernte Datenbank wird auf heute vorverlegt.

Ab diesem Punkt wird die Zeile erst dann heruntergeladen, wenn sie aktualisiert wurde. Als mögliche Behelfslösung können Sie ein modify_next_last_download_timestamp-Skript implementieren und die Zeit des letzten Downloads auf die Anfangszeit der ältesten offenen Transaktion setzen.

Siehe auch
SQL-Beispiel

Das folgende Beispiel stammt aus einer Oracle-Installation.Die Anweisung kann jedoch mit allen unterstützten Datenbanken eingesetzt werden. Im Beispiel werden alle Zeilen heruntergeladen, die geändert wurden, seit der Benutzer den letzten Datendownload vorgenommen hat, und die mit dem Benutzernamen in der Spalte emp_name übereinstimmen.

CALL ml_add_table_script( 
  'Lab',
  'ULOrder',
  'download_cursor',
  'SELECT order_id, 
    cust_id, 
    prod_id, 
    emp_id, 
    disc, 
    quant, 
    notes, 
    status
   FROM ULOrder 
   WHERE last_modified >= {ml s.last_table_download} 
    AND emp_name = {ml s.username}' )
Java-Beispiel

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

CALL ml_add_java_table_script(
   'ver1',
   'ULCustomer',
   'download_cursor',
   'ExamplePackage.ExampleClass.downloadCursor ' )

Im Folgenden sehen Sie die Java-Beispielmethode downloadCursor. Sie gibt eine SQL-Anweisung zum Download von Zeilen zurück, deren Inhalt in der Spalte last_modified größer als bzw. gleich dem letzten Download-Zeitpunkt ist.

public String downloadCursor( 
  java.sql.Timestamp ts, 
  String user )  {
  return( "SELECT cust_id, cust_name FROM ULCustomer 
             WHERE last_modified >= ' " 
   + ts + " ' ");
}
.NET-Beispiel

Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens DownloadCursor als das Skript für das Tabellenereignis download_cursor, wenn die Skriptversion ver1 und die Tabelle table1 synchronisiert werden.

CALL ml_add_dnet_table_script(
 'ver1', 
 'table1', 
 'download_cursor',
 'TestScripts.Test.DownloadCursor'
)

Im Folgenden sehen Sie die .NET-Beispielmethode DownloadCursor. Sie füllt eine temporäre Tabelle mit Daten aus der Datei rows.txt. Anschließend wird ein Cursor zurückgegeben, der MobiLink veranlasst, die Zeilen in der temporären Tabelle an die entfernte Datenbank zu senden. Diese Syntax gilt für konsolidierte SQL Anywhere-Datenbanken.

public string DownloadCursor( 
  DateTime ts, 
  string user ) {
  DBCommand stmt   = curConn.CreateCommand();
  StreamReader input  = new StreamReader( "rows.txt" );
  string sql    = input.ReadLine();
  stmt.CommandText = "DELETE FROM dnet_dl_temp";
  stmt.ExecuteNonQuery();
  while( sql != null ){
    stmt.CommandText = "INSERT INTO dnet_dl_temp VALUES " + sql;
    stmt.ExecuteNonQuery();
    sql = input.ReadLine();
  }
  return( "SELECT * FROM dnet_dl_temp" );
}