定义游标以选择为远程数据库将要下载并插入或更新的行。
在下表中,[说明] 部分提供 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。
下例来自于 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 = ?' )此时,您仍然必须使用这两个参数,不过第一个 ?是一个没有任何作用的占位符。
下面的存储过程调用在同步脚本版本 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 + " ' ");
}下面的存储过程调用在同步脚本版本 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" );
}SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。