为 MobiLink 服务器提供一个在上载处理过程中使用的事件,该事件用于处理在远程数据库中进行更新的行。
参数 | 顺序 |
---|---|
r.column-1 | 1 |
... | ... |
r.column-M | M |
r.pk-column-1 | M + 1 |
... | ... |
r.pk-column-N | M + N |
o.column-N | M + N + 1 |
... | ... |
o.column-M | M + N + M |
无。
基于语句的 upload_update 脚本可用于直接更新列值,该列值由 UPLOAD 语句指定。
WHERE 子句必须包括正被同步的所有主键列。SET 子句必须包含正被同步的所有非主键列。
您可以在 SET 子句中使用表中存在的任意非主键列,MobiLink 将发送正确的列值数目。同样,在 WHERE 子句中,您也可以使用任意数目的主键,但它们必须都在此处指定,并且 MobiLink 能够发送正确的值。MobiLink 将发送这些列值和主键值,发送的顺序与表模式的 MobiLink 报告中列和主键出现的顺序相同。您可以使用 -vh 选项为此表模式确定列的顺序。
例如,在以下 upload_update 脚本中,问号的顺序正确:
UPDATE MyTable SET column_1 = ?, ..., column_M = ? WHERE pk_column_1 = ? AND ... AND pk_column_N = ? |
您可以为远程数据库的每个表编写一个 upload_update 脚本。
对于 Java 和 .NET 应用程序,此脚本必须返回有效的 SQL。
要使用 upload_update 脚本检测冲突,请在 WHERE 子句中包括所有非主键列。
UPDATE table-name SET col1 = {ml r.col1}, col2 = {ml r. col2 } ... WHERE pk1 = {ml r.pk1} AND pk2 = {ml r.pk2} ... AND col1 = {ml o.col1} AND col2 ={ml o.col2} ...
在此语句中,col1 和 col2 是非主键列,而 pk1 和 pk2 是主键列。传递到第二组非主键列中的值是更新行的前映像。WHERE 子句将比较从远程数据库上载的旧值与统一数据库中的当前值。如果两个值不匹配,将忽略更新,保留统一数据库中已有的值。
此示例处理远程数据库中对 Customer 表进行的更新。该脚本将更新统一数据库中名为 Customer 的表中的值。
CALL ml_add_table_script( 'ver1', 'table1', 'upload_update', 'UPDATE Customer SET name = {ml r.name}, rep_id = {ml r.rep_id} WHERE cust_id = {ml o.cust_id}') |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 uploadUpdateTable 的 Java 方法注册为 upload_update 表事件的脚本。
CALL ml_add_java_table_script( 'ver1', 'table1', 'upload_update', 'ExamplePackage.ExampleClass.uploadUpdateTable' ) |
以下是 Java 方法 uploadUpdateTable 示例。它调用名为 genUU 的方法来动态生成一条 UPLOAD 语句。
public String uploadUpdateTable() { return( genUU(_curTable) ); } |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 和表 table1 时将名为 UploadUpdate 的 .NET 方法注册为 upload_update 表事件的脚本。
CALL ml_add_dnet_table_script( 'ver1', 'table1', 'upload_update', 'TestScripts.Test.UploadUpdate' ) |
以下是 .NET 方法 UploadUpdate 示例。它调用名为 GenUU 的方法来动态生成一条 UPLOAD 语句。
public string UploadUpdate() { return ( genUU(_curTable) ); } |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |