ダイレクトローハンドリングにおいて、アップロードされたローの処理に使用される非 SQL データスクリプトです。
SQL スクリプトのパラメータ名 | 説明 | 順序 (SQL では非推奨) |
---|---|---|
UploadData | .NET または Java クラスは、Mobile Link クライアントによってアップロードされたテーブル操作をカプセル化します。このクラスは、Java と .NET 用 Mobile Link サーバ API で定義されています。 | 1 |
s.script_version | VARCHAR(128)。Mobile Link サーバが現在の同期に使用しているスクリプトバージョン文字列をこのパラメータに渡すことを指定する、オプションの IN パラメータ。このパラメータの指定に疑問符を使用することはできません。 | 適用外 |
なし。
handle_UploadData イベントを使用すると、Mobile Link のダイレクトローハンドリングでアップロードを処理できます。このイベントは、同期のアップロードトランザクションごとに発生します。ただし、トランザクションレベルアップロードを使用している場合は、トランザクションごとに発生します。
ダイレクトローハンドリングを参照してください。
このイベントは 1 つの UploadData パラメータを取ります。Java または .NET メソッドは UploadData の getUploadedTables または getUploadedTableByName メソッドを使用して、UploadedTableData インスタンスを取得できます。UploadedTableData を使用して、現在の同期で Mobile Link クライアントによってアップロードされた挿入、更新、削除操作にアクセスできます。
UploadData と UploadedTableData クラスの詳細については、ダイレクトアップロードを参照してください。
カラム名は、デフォルトでは最初の同期で常に Mobile Link サーバに送信され、再送信を回避するために Mobile Link サーバによってキャッシュされます。必要に応じて、ml_add_column システムプロシージャを使用してカラム名を設定できます (廃止)。それ以外の方法でカラムを参照するには、リモートデータベースに定義されているインデックスを使用します。
更新のアップロードされた更新前イメージカラムを取得するには、SetOldRowValues メソッドと SetNewRowValues メソッドを使用します。 ダイレクトアップロードでの競合を参照してください。
このイベントは SQL として実装できません。
次の Mobile Link システムプロシージャコールは、スクリプトバージョン ver1 を同期するときに、handle_UploadData 接続イベントに対して handleUpload という Java メソッドを登録します。Mobile Link 統合データベースに対してこのシステムプロシージャを実行します。
CALL ml_add_java_connection_script( 'ver1', 'handle_UploadData', 'MyPackage.MyClass.handleUpload' ) |
ml_add_java_connection_script の詳細については、ml_add_java_connection_script システムプロシージャを参照してください。
次の Java メソッドは remoteOrders テーブルのアップロードを処理します。UploadData.getUploadedTableByName メソッドは remoteOrders テーブルの UploadedTableData インスタンスを返します。UploadedTableData の getInserts メソッドは、新しいローを表す java.sql.ResultSet インスタンスを返します。
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(); }} |
次の例は、Mobile Link リモートデータベースによってアップロードされた挿入、更新、削除操作を出力します。UploadData の getUploadedTables メソッドは、リモートによってアップロードされたすべてのテーブルを表す UploadedTableData インスタンスを返します。配列内でのテーブルの順序は、リモートによってアップロードされた順序と同じです。UploadedTableData の getInserts、getUpdates、getDeletes メソッドは標準 JDBC 結果セットを返します。println メソッドまたは出力データを使用して、テキストファイルまたは別の場所に出力できます。
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() ); } } |
printRSInfo メソッドは、挿入、更新、または削除の結果セットを出力し、1 つの java.sql.ResultSet オブジェクトを受け入れます。カラムラベルを含む、詳細なカラム情報は、ResultSet の getMetaData メソッドによって返される ResultSetMetaData オブジェクトによって提供されます。printRow メソッドは結果セットの各ローを出力します。
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(); } |
次に示す printRow メソッドは ResultSet の getString メソッドを使用して、各カラム値を取得します。
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 ); } |
次の Mobile Link システムプロシージャコールは、スクリプトバージョン ver1 を同期するときに、handle_UploadData 接続イベントに対して HandleUpload という .NET メソッドを登録します。Mobile Link 統合データベースに対してこのシステムプロシージャを実行します。
CALL ml_add_dnet_connection_script( 'ver1', 'handle_UploadData', 'TestScripts.Test.HandleUpload' ) |
次の .NET メソッドは remoteOrders テーブルのアップロードを処理します。この例では、SetOldRowValues メソッドと SetNewRowValues メソッドを使用して、各更新の更新前イメージと更新後イメージの両方にアクセスします。
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 ); } } } |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |