Collection Contents 上一页 下一页 PDF

MobiLink 管理指南

同步事件

download_cursor 表事件


功能 

定义游标以选择为远程数据库将要下载并插入或更新的行。

参数 

在下表中,[说明] 部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见 SQL-Java 数据类型SQL-.NET 数据类型

只有当未指定任何后续参数时,事件参数才是可选的。如果要使用参数 2,您必须使用参数 1。

参数 说明
1 last_download TIMESTAMP
2 ml_username VARCHAR(128)
缺省操作 

无。

可以使用 MobiLink 同步服务器 -za 选项生成缺省 download_cursor SQL 脚本。此外,UltraLite 分析器也可以基于您的参考数据库生成一个 SELECT 语句,您可以用该语句作为起点。

说明 

MobiLink 同步服务器打开一个只读游标,并使用此游标读取要下载到远程数据库上的行列表。该脚本应该包含适当的 SELECT 语句。

参数为 last_download 时间戳及用户名。您可以通过在 SQL 语句中放置问号以选择使用这些值。

您可以为远程数据库的每个表编写一个 download_cursor 脚本。

在下载阶段紧前面的最后一次成功的同步过程中,从统一数据库中获取的时间值即为 last_download 时间戳。如果当前用户从未成功地进行过同步,则该值将被设置为 1900-01-01。

为了优化 UltraLite 客户端同步过程中下载阶段的性能,当主键值的范围超出了设备上的当前行时,您应按照主键对下载游标中的行进行排序。例如,下载大型参考表时将从这种优化中受益。

每个 download_cursor 脚本必须包含一个 SELECT 语句或一个包含 SELECT 语句的过程调用。MobiLink 同步服务器将使用此语句在统一数据库中定义游标。

该脚本必须选择与远程数据库中相对应的表中的列对应的所有列。统一数据库中的列可以与远程数据库中相应的列具有不同的名称,但是列的类型必须兼容。

必须按照远程数据库中对应列的定义顺序来选择列。此顺序与参考数据库中列的顺序一致。

注意,download_cursor 允许级联删除。因此,您可以从数据库中删除记录。

对于 Java 和 .NET 应用程序,此脚本必须返回有效的 SQL。

另请参见 
SQL 示例 

下例来自于 Oracle 安装,但语句对于所有支持的数据库都有效。该示例将下载自从用户上次下载数据以来更改过且与 emp_name 列中的用户名相匹配的所有行。

call ml_add_table_script( 
  'Lab',
  'ULOrder',
  'download_cursor',
  'SELECT order_id, cust_id, prod_id, emp_id, 
      disc, quant, notes, status
       FROM ULOrder 
       WHERE last_modified >= ? AND emp_name = ?' )

编写不使用第一个参数(last_download 时间戳)而使用第二个参数(MobiLink 用户名)的 download_cursor 脚本,然后添加不会影响任何行的虚子句。例如:

call ml_add_table_script(
   'Lab',
   'ULOrder',
   'download_cursor',
   'SELECT order_id, cust_id, prod_id, emp_id, disc,
       quant, notes, status
        FROM ULOrder WHERE ? IS NOT NULL AND emp_name = ?' )

此时,您仍然必须使用这两个参数,不过第一个 ?是一个没有任何作用的占位符。

Java 示例 

下面的存储过程调用在同步脚本版本 ver1 时将名为 downloadCursor 的 Java 方法注册为 download_cursor 表事件的脚本。

call ml_add_java_table_script(
   'ver1',
   'ULCustomer',
   'download_cursor',
   'ExamplePackage.ExampleClass.downloadCursor ' )

下面是示例 Java 方法 downloadCursor。它返回一条 SQL 语句,用于下载 last_modified 列大于或等于上次下载时间的行。

public String downloadCursor(java.sql.Timestamp ts,String user )
 {
  return("SELECT cust_id, cust_name FROM ULCustomer where last_modified >= ' " + ts + " ' ");
 }
.NET 示例 

下面的存储过程调用在同步脚本版本 ver1 和表 table1 时将名为 DownloadCursor 的 .NET 方法注册为 download_cursor 表事件的脚本。

call ml_add_dnet_table_script(
  'ver1', 'table1', 'download_cursor',
  'TestScripts.Test.DownloadCursor'
)

下面是示例 .NET 方法 DownloadCursor。它用名为 rows.txt 的文件的内容填充临时表。然后它返回一个游标,该游标使 MobiLink 将临时表中的行发送到远程数据库。此语法用于 Adaptive Server Anywhere 统一数据库。

public string DownloadCursor( 
   DateTime ts, 
   string user )
{
  DBCommand   stmt   = curConn.CreateCommand();
  StreamReader  input  = new StreamReader( "rows.txt" );
  string        sql    = input.ReadLine();

  stmt.CommandText = "DELETE FROM dnet_dl_temp";
  stmt.ExecuteNonQuery();

  while( sql != null ){
   stmt.CommandText = "INSERT INTO dnet_dl_temp VALUES " + sql;
   stmt.ExecuteNonQuery();
   sql = input.ReadLine();
  }
  return( "SELECT * FROM dnet_dl_temp" );
}

Collection Contents 上一页 下一页 PDF