使用下载确认时,此脚本会提供用于记录有关已成功下载发布的信息的位置。
在下表中,说明部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。 请参见SQL-Java 数据类型和SQL-.NET 数据类型。
在 SQL 脚本中,可以按名称或使用问号指定事件参数。不建议使用问号,建议您使用命名参数。不能在一个脚本中混合使用名称和问号。如果使用问号,则参数必须按照如下所示的顺序并且仅当没有指定任何后继参数时才是可选的(例如,如果您想使用参数 2,则必须使用参数 1)。如果使用命名参数,则可以按照任何顺序指定任意参数子集。
SQL 脚本的参数名称 | 说明 | 顺序(不建议用于 SQL) |
---|---|---|
s.remote_id | VARCHAR(128)。MobiLink 远程 ID。只有在使用命名参数时才能引用远程 ID。 | 不适用 |
s.username |
VARCHAR(128)。MobiLink 用户名。 |
1 |
s.last_publication_download |
TIMESTAMP。任何已同步表的上一次下载时间。 |
2 |
s.publication name | VARCHAR(128)。发布的名称。 | 3 |
s.subscription_id | VARCHAR(128)。远程预订 ID。 | 4 |
s.script_version | VARCHAR(128)。可选的 IN 参数,可指定 MobiLink 服务器将用于当前同步的脚本版本字符串传递到此参数。不能使用问号指定此参数。 | 不适用 |
当在远程数据库中成功应用此发布的下载时,此事件允许您记录时间。
仅在使用下载确认时才调用此事件。如果在处于非阻塞模式时发送下载,则将提交下载事务并结束同步。当同步客户端确认下载成功时,下载中的每个发布都会调用该事件一次。在原始同步的 end_synchronization 脚本之后,于新连接上调用此事件。此事件的操作与 MobiLink 系统表中下载时间的更新一起提交。
如果下载不成功或网络连接被删除,则不存在通知且不会调用该脚本。如果及时的下载通知对您的业务需求至关重要,则应使用 prepare_for_download 脚本的 last_download 参数或 begin_publication 脚本的 last_publication_download 参数作为下载通知处理的备份。
由于此脚本的特殊性质,执行此事件时,同步过程中设置的任何连接级变量均不可用。
以下脚本将记录添加到名为 download_pubs_acked 的表中。该记录包含发布名称、第一个验证参数和下载时间戳。
INSERT INTO download_pubs_acked( pub_name, auth_parm, last_download ) VALUES( {ml s.publication_name}, {ml a.1}, {ml s.last_publication_download} ) |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 publicationDownloadACK 的 Java 方法注册为 publication_nonblocking_download_ack 连接事件的脚本。
CALL ml_add_java_connection_script ( 'ver1', 'publication_nonblocking_download_ack', 'ExamplePackage.ExampleClass.publicationDownloadACK' ) |
以下是 Java 方法 publicationDownloadACK 示例。如果下载了相当重要的发布,它会通过进行确认而执行某些业务逻辑。
package ExamplePackage; import ianywhere.ml.script.*; import java.sql.*; public class ExampleClass { DBConnectionContext _cc; public ExampleClass( DBConnectionContext cc ) { _cc = cc; } public void confirmDownload( String user, Timestamp ts, String pubName ) throws SQLException { Connection conn = _cc.getConnection(); PreparedStatement stmt = conn.prepareStatement( "INSERT INTO download_pubs_acked( rem_id, last_download, pub_name ) " + "VALUES( ?, ?, ? )" ); stmt.setString( 1, _cc.getRemoteID() ); stmt.setTimestamp( 2, ts ); stmt.setString( 3, pubName ); stmt.executeUpdate(); stmt.close(); } } |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 EndTableDownload 的 .NET 方法注册为 end_download 表事件的脚本。
CALL ml_add_dnet_connection_script( 'ver1', 'publication_nonblocking_download_ack', 'TestScripts.Test.EndTableDownload' ) |
以下是 .NET 方法 EndTableDownload 示例。如果下载了相当重要的发布,它会通过进行确认而执行某些业务逻辑。
using System; using iAnywhere.MobiLink.Script; namespace TestScripts { public class Test { DBConnectionContext _cc; public Test( DBConnectionContext cc ) { _cc = cc; } public void ConfirmDownload( string user, DateTime dt, string pubName ) { DBConnection conn = _cc.GetConnection(); DBCommand cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO download_pubs_acked( rem_id, last_download, pub_name ) " + "VALUES( ?, ?, ? )"; cmd.Parameters[0] = _cc.GetRemoteID(); cmd.Parameters[1] = dt; cmd.Parameters[2] = pubName; cmd.ExecuteNonQuery(); } } } |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |