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

SQL Anywhere 11.0.1 (中文) » MobiLink - 服务器管理 » MobiLink 事件 » 同步事件

 

handle_UploadData 连接事件

由直接行处理用来处理上载的行。

参数
SQL 脚本的参数名称 说明 顺序
UploadData 封装 MobiLink 客户端上载的表操作的 .NET 或 Java 类。该类在面向 Java 和 .NET 的 MobiLink 服务器 API 中定义。 1
缺省操作

无。

注释

handle_UploadData 事件允许您为 MobiLink 直接行处理处理上载。在同步中此事件对每个上载事务触发一次,除非您正在使用事务级上载,在这种情况下,它对每个事务进行触发。

请参见直接行处理

此事件使用单个 UploadData 参数。您的 Java 或 .NET 方法可以使用 UploadData getUploadedTables 或 getUploadedTableByName 方法获得 UploadedTableData 实例。UploadedTableData 允许您在当前同步中访问由 MobiLink 客户端上载的插入、更新和删除操作。

有关 UploadData 和 UploadedTableData 类的详细信息,请参见处理直接上载

如果您要读取列名元数据,则您必须指定 SendColumnNames MobiLink 客户端扩展选项或属性。否则,您可以按索引引用列,如在远程数据库中定义的那样。

请参见SendColumnNames (scn) 扩展选项Send Column Names 同步参数

注意

此事件不能作为 SQL 实现。

另请参见
Java 示例

以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时,为 handle_UploadData 连接事件注册名为 handleUpload 的 Java 方法。针对您的 MobiLink 统一数据库运行此系统过程。

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

}

以下示例输出由 MobiLink 远程数据库上载的插入、更新和删除操作。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 方法输出插入、更新或删除结果集并接受单个 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 示例

以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时,为 handle_UploadData 连接事件注册名为 HandleUpload 的 .NET 方法。针对您的 MobiLink 统一数据库运行此系统过程。

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