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 |
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 verarbeiten.
Wenn Sie die Metadaten der Spaltennamen lesen möchten, müssen Sie die erweiterte SendColumnNames-Option oder -Eigenschaft des MobiLink-Clients angeben. Ab Version 12 ist SendColumnNames standardmäßig aktiviert. Optional können Sie Spaltennamen mit der Systemprozedur ml_add_column festlegen. Andernfalls können Sie Spalten nach Index referenzieren, wie in der entfernten Datenbank definiert.
Siehe Erweiterte Option SendColumnNames (scn) und Synchronisationsparameter Send Column Names.
Um die hochgeladenen Pre-Image-Spalten für eine Aktualisierung abzurufen, verwenden Sie die Methoden SetOldRowValues und SetNewRowValues. Siehe Direkte Upload-Konflikte verarbeiten.
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.
import ianywhere.ml.script.*; import java.sql.*; import java.io.*; // ... 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() ) { // You can reference column names here because SendColumnNames is on. // 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. Spaltenlabel sind nur verfügbar, wenn die Option SendColumnNames für den Client eingeschaltet ist. 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 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |