Ein Nicht-SQL-Datenskript, das von der direkten Zeilenbehandlung zum Verarbeiten von hochgeladenen Zeilen verwendet wird.
Parametername für SQL-Skripten | Beschreibung | Reihenfolge (veraltet für SQL) |
---|---|---|
UploadData | Eine .NET- oder Java-Klasse mit Tabellenvorgängen, die von einem MobiLink-Client hochgeladen wurden. Diese Klasse ist in der API für Java und .NET des MobiLink-Servers definiert. | 1 |
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.
Das Ereignis handle_UploadData ermöglicht Ihnen, den Upload für die direkte Zeilenbehandlung in MobiLink zu verarbeiten. Dieses Ereignis wird für jede Uploadtransaktion in einer Synchronisation einmal ausgelöst. Wenn Sie jedoch Uploads auf Transaktionsebene verwenden, wird das Ereignis für jede Transaktion ausgelöst.
Siehe Direkte Zeilenbehandlung.
Dieses Ereignis verwendet nur einen UploadData-Parameter. Die Java- oder .NET-Methode kann mit den Methoden UploadData getUploadedTables oder getUploadedTableByName Instanzen von UploadedTableData abrufen. Mit UploadedTableData greifen Sie auf Einfüge-, Aktualisierungs- und Löschvorgänge zu, die ein MobiLink-Client in die aktuelle Synchronisation hochgeladen hat.
Weitere Hinweise zu den Klassen UploadData und UploadedTableData finden Sie unter Direkte Uploads.
Standardmäßig werden Spaltennamen bei der ersten Synchronisation mit einem MobiLink-Serverinstanz immer gesendet und anschließend vom MobiLink-Server im Cache abgelegt, damit sie nicht erneut gesendet werden müssen. Optional können Sie Spaltennamen mit der ml_add_column-Systemprozedur festlegen (nicht mehr empfohlen). Andernfalls können Sie Spalten nach Index referenzieren, wie in der entfernten Datenbank definiert.
Um die hochgeladenen Pre-Image-Spalten für eine Aktualisierung abzurufen, verwenden Sie die Methoden SetOldRowValues und SetNewRowValues. Siehe Konflikte bei direkten Uploads.
Dieses Ereignis kann nicht als SQL implementiert werden.
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens handleUpload für das Verbindungsereignis handle_UploadData, wenn die Skriptversion ver1 synchronisiert wird. Sie führen diese Systemprozedur für Ihre konsolidierte MobiLink-Datenbank aus.
CALL ml_add_java_connection_script( 'ver1', 'handle_UploadData', 'MyPackage.MyClass.handleUpload' ) |
Weitere Hinweise zu ml_add_java_connection_script finden Sie unter ml_add_java_connection_script-Systemprozedur.
Die folgende Java-Methode verarbeitet den Upload für die remoteOrders-Tabelle. Die Methode UploadData.getUploadedTableByName gibt eine UploadedTableData-Instanz für die remoteOrders-Tabelle zurück. Die Methode UploadedTableData getInserts gibt eine java.sql.ResultSet-Instanz mit neuen Zeilen zurück.
package MyPackage; import ianywhere.ml.script.*; import java.sql.*; import java.io.*; // ... public class MyClass { String _curUser = null; public void handleUpload( UploadData ut ) throws SQLException, IOException { // Get an UploadedTableData instance representing the // remoteOrders table. UploadedTableData remoteOrdersTable = ut.getUploadedTableByName("remoteOrders"); // Get inserts uploaded by the MobiLink client. java.sql.ResultSet results = remoteOrdersTable.getInserts(); while( results.next() ) { // Get the primary key. int pk = results.getInt("pk"); // Get the uploaded num_ordered value. int numOrdered = results.getInt("num_ordered"); // The current insert row is now ready to be uploaded to wherever // you want it to go (a file, a web service, and so on). } results.close(); }} |
Das folgende Beispiel gibt Einfüge-, Aktualisierungs- und Löschvorgänge aus, die von einer entfernten MobiLink-Datenbank hochgeladen wurden. Die Methode UploadData getUploadedTables gibt UploadedTableData-Instanzen zurück, die alle Tabellen repräsentieren, die von einem entfernten Client hochgeladen wurden. Die Reihenfolge der Tabellen in diesem Array ist die Reihenfolge, in der sie vom entfernten Client hochgeladen wurden. Die Methoden UploadedTableData getInserts, getUpdates und getDeletes geben Standard-JDBC-Ergebnismengen zurück. Sie können die Methode println benutzen oder die Daten in eine Textdatei oder an einer anderen Stelle ausgeben.
import ianywhere.ml.script.*; import java.sql.*; import java.io.*; // ... public void handleUpload( UploadData ud ) throws SQLException, IOException { UploadedTableData tables[] = ud.getUploadedTables(); for( int i = 0; i < tables.length; i++ ) { UploadedTableData currentTable = tables[i]; println( "table " + java.lang.Integer.toString( i ) + " name: " + currentTable.getName() ); // Print out insert result set. println( "Inserts" ); printRSInfo( currentTable.getInserts() ); // print out update result set println( "Updates" ); printUpdateRSInfo( currentTable.getUpdates() ); // Print out delete result set. println( "Deletes" ); printRSInfo( currentTable.getDeletes() ); } } |
Die Methode printRSInfo druckt die Ergebnismenge der Einfüge-, Aktualisierungs- oder Löschvoränge aus und akzeptiert ein einzelnes java.sql.ResultSet-Objekt. Ausführliche Spalteninformationen einschließlich Spaltenlabel liefert das Objekt ResultSetMetaData, das von der Methode ResultSet getMetaData zurückgegeben wird. Die Methode printRow druckt jede Zeile in einer Ergebnismenge aus.
public void printRSInfo( ResultSet results ) throws SQLException, IOException { // Obtain the result set metadata. ResultSetMetaData metaData = results.getMetaData(); String columnHeading = ""; // Print out column headings. for( int c = 1; c <= metaData.getColumnCount(); c++ ) { columnHeading += metaData.getColumnLabel(c); if( c < metaData.getColumnCount() ) { columnHeading += ", "; } } println( columnHeading ); while( results.next() ) { // Print out each row. printRow( results, metaData.getColumnCount() ); } // Close the java.sql.ResultSet. results.close(); } |
Die nachfolgend aufgeführte Methode printRow ruft jeden Spaltenwert mit der Methode ResultSet getString ab.
public void printRow( ResultSet results, int colCount ) throws SQLException, IOException { String row = "( "; for( int c = 1; c <= colCount; c++ ) { // Get a column value. String currentColumn = results.getString( c ); // Check for null values. if( currentColumn == null ) { currentColumn = "<NULL>"; } // Add the column value to the row string. row += cur_col; if( c < colCount ) { row += ", "; } } row += " )"; // Print out the row. println( row ); } |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens HandleUpload für das Verbindungsereignis handle_UploadData, wenn die Skriptversion ver1 synchronisiert wird. Sie führen diese Systemprozedur für Ihre konsolidierte MobiLink-Datenbank aus.
CALL ml_add_dnet_connection_script( 'ver1', 'handle_UploadData', 'TestScripts.Test.HandleUpload' ) |
Die folgende .NET-Methode verarbeitet den Upload für die remoteOrders-Tabelle. Im folgenden Beispiel werden die Methoden SetOldRowValues und SetNewRowValues verwendet, um sowohl auf das Pre-Image als auch auf das Post-Image jeder Aktualisierung zuzugreifen.
using System; using System.Data; using System.IO; using iAnywhere.MobiLink.Script; using iAnywhere.MobiLink; namespace MyScripts { public class MyUpload { public MyUpload( DBConnectionContext cc ) { } ~MyUpload() { } public void handleUpload( UploadData ut ) { int i; UploadedTableData[] tables = ut.GetUploadedTables(); for( i=0; i<tables.Length; i+=1 ) { UploadedTableData cur_table = tables[i]; Console.Write( "table " + i + " name: " + cur_table.GetName() ); // Print out insert result set. Console.Write( "Inserts" ); printRSInfo( cur_table.GetInserts() ); // print out update result set Console.Write( "Updates" ); printUpdateRSInfo( cur_table.GetUpdates() ); // Print out delete result set. Console.Write( "Deletes" ); printRSInfo( cur_table.GetDeletes() ); } } public void printRSInfo( IDataReader dr ) { // Obtain the result set metadata. DataTable dt = dr.GetSchemaTable(); DataColumnCollection cc = dt.Columns; DataColumn dc; String columnHeading = ""; // Print out column headings. for( int c=0; c < cc.Count; c = c + 1 ) { dc = cc[ c ]; columnHeading += dc.ColumnName; if( c < cc.Count - 1 ) { columnHeading += ", "; } } Console.Write( columnHeading ); while( dr.Read() ) { // Print out each row. printRow( dr, cc.Count ); } // Close the java.sql.ResultSet. dr.Close(); } public void printUpdateRSInfo( UpdateDataReader utr ) { // Obtain the result set metadata. DataTable dt = utr.GetSchemaTable(); DataColumnCollection cc = dt.Columns; DataColumn dc; String columnHeading = "TYPE, "; // Print out column headings. for( int c = 0; c < cc.Count; c = c + 1 ) { dc = cc[ c ]; columnHeading += dc.ColumnName; if( c < cc.Count - 1 ) { columnHeading += ", "; } } Console.Write( columnHeading ); while( utr.Read() ) { // Print out the new values for the row. utr.SetNewRowValues(); Console.Write( "NEW:" ); printRow( utr, cc.Count ); // Print out the old values for the row. utr.SetOldRowValues(); Console.Write( "OLD:" ); printRow( utr, cc.Count ); } // Close the java.sql.ResultSet. utr.Close(); } public void printRow( IDataReader dr, int col_count ) { String row = "( "; int c; for( c = 0; c < col_count; c = c + 1 ) { // Get a column value. String cur_col = dr.GetString( c ); // Check for null values. if( cur_col == null ) { cur_col = "<NULL>"; } // Add the column value to the row string. row += cur_col; if( c < col_count ) { row += ", "; } } row += " )"; // Print out the row. Console.Write( row ); } } } |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |