由直接行处理使用的非 SQL 数据脚本,用来处理上载的行。
SQL 脚本的参数名称 | 说明 | 顺序(不建议用于 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 客户端扩展选项或属性。从版本 12 开始,SendColumnNames 在缺省情况下是开启的。或者,您可使用 ml_add_column 系统过程建立列名。否则,您可以按索引引用列,如在远程数据库中定义的那样。
请参见SendColumnNames (scn) 扩展选项和发送列名同步参数。
要为更新获取上载的前映像列,请使用 SetOldRowValues 和 SetNewRowValues 方法。 请参见处理直接上载冲突。
此事件不能作为 SQL 实现。
以下对 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 实例。
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() ) { // 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 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 方法输出插入、更新或删除结果集并接受单个 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 ); } |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时,为 handle_UploadData 连接事件注册名为 HandleUpload 的 .NET 方法。针对您的 MobiLink 统一数据库运行此系统过程。
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讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |