Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » Mobile Link - サーバ管理 » Mobile Link イベント » 同期イベント

 

handle_UploadData 接続イベント

ダイレクト・ロー・ハンドリングにおいて、アップロードされたローの処理に使用されます。

パラメータ
SQL スクリプトのパラメータ名 説明 順序
UploadData .NET または Java クラスは、Mobile Link クライアントによってアップロードされたテーブル操作をカプセル化します。このクラスは、Java と .NET 用 Mobile Link サーバ API で定義されています。 1
デフォルトのアクション

なし

備考

handle_UploadData イベントを使用すると、Mobile Link のダイレクト・ロー・ハンドリングでアップロードを処理できます。このイベントは、同期のアップロード・トランザクションごとに発生します。ただし、トランザクション・レベル・アップロードを使用している場合は、トランザクションごとに発生します。

ダイレクト・ロー・ハンドリングを参照してください。

このイベントは 1 つの UploadData パラメータを取ります。Java または .NET メソッドは UploadData の getUploadedTables または getUploadedTableByName メソッドを使用して、UploadedTableData インスタンスを取得できます。UploadedTableData を使用して、現在の同期で Mobile Link クライアントによってアップロードされた挿入、更新、削除操作にアクセスできます。

UploadData と UploadedTableData クラスの詳細については、ダイレクト・アップロードの処理を参照してください。

カラム名メタデータを読み込む場合は、SendColumnNames Mobile Link クライアント拡張オプションまたはプロパティを指定してください。それ以外の方法でカラムを参照するには、リモート・データベースに定義されているインデックスを使用します。

SendColumnNames (scn) 拡張オプションSend Column Names 同期パラメータを参照してください。

注意

このイベントは SQL として実装できません。

参照
Java の例

次の 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 インスタンスを返します。

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();

}

次の例は、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 delete result set.
    println( "Deletes" );
    printRSInfo( currentTable.getDeletes() );
    // Print out insert result set.
    println( "Inserts" );
    printRSInfo( currentTable.getInserts() );
    // print out update result set
    println( "Updates" );
    printUpdateRSInfo( currentTable.getUpdates() );
  }
}

printRSInfo メソッドは、挿入、更新、または削除の結果セットを出力し、1 つの java.sql.ResultSet オブジェクトを受け入れます。カラム・ラベルを含む、詳細なカラム情報は、ResultSet の getMetaData メソッドによって返される ResultSetMetaData オブジェクトによって提供されます。カラム・ラベルは、クライアントで SendColumnNames オプションが有効になっている場合にのみ使用できます。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 );
}
.NET の例

次の Mobile Link システム・プロシージャ・コールは、スクリプト・バージョン ver1 を同期するときに、handle_UploadData 接続イベントに対して HandleUpload という .NET メソッドを登録します。Mobile Link 統合データベースに対してこのシステム・プロシージャを実行します。

CALL ml_add_dnet_connection_script( 
  'ver1',
  'handle_UploadData',
  'TestScripts.Test.HandleUpload' )

次の .NET メソッドは remoteOrders テーブルのアップロードを処理します。

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 delete result set.
  Console.Write( "Deletes" );
  printRSInfo( cur_table.GetDeletes() );

  // Print out insert result set.
  Console.Write( "Inserts" );
  printRSInfo( cur_table.GetInserts() );

  // print out update result set
  Console.Write( "Updates" );
  printUpdateRSInfo( cur_table.GetUpdates() );
     }
 }

 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 );
 }
    }
}