应用程序的部署和版本控制
本主题介绍客户端和服务器应用程序的部署和版本控制。有关初始化对等数据库的信息,请参见如何配置和执行协作同步(非 SQL Server)中的“初始化服务器数据库”。
使用 Sync Framework 的客户端和服务器应用程序的部署方式取决于应用程序的体系结构是双层还是 N 层的。在双层应用程序中,所有同步代码均位于客户端,而且可以像部署基于 SQL Server Compact 的任何其他应用程序那样部署应用程序。通常,部署操作需要使用 ClickOnce 发布应用程序,或者需要打包应用程序然后再将其复制到每个客户端。有关如何部署使用 SQL Server Compact 的应用程序的更多信息,请参见 SQL Server Compact 联机丛书中的主题“部署应用程序”和“如何生成应用程序并将其部署到桌面”。在 N 层应用程序中,还必须将代码部署到承载服务器端同步组件的计算机。
创建和初始化客户端数据库
对于双层和 N 层应用程序,必须决定如何创建和初始化拥有应用程序所需的架构和数据的客户端数据库。有两种主要的方法:
使用 Sync Framework 创建数据库,然后在初次同步过程中下载表架构和数据。这是最简单的方法。但是,如果客户端比较多并且数据量很大,这可能会产生大量的网络流量和需要服务器执行大量处理工作。
预先创建具有表架构和初始数据集的数据库。采用 .sdf 文件这种形式的数据库可以被客户端应用程序传输或下载。如果应用程序下载增量变更,它可以在初次同步过程中将客户端数据库置于最新状态。如果使用此方法,请为 CreationOption 属性设置一个适当的值。
如果应用程序包括了上载操作,并且您想要知道发生变更的位置,应用程序可以设置 ClientId 属性以唯一地向服务器标识客户端数据库;或者 Sync Framework 将为数据库生成一个新 ID。
备注
预先创建客户端数据库这种方法不适用于为每个客户端筛选不同数据的应用程序。它会导致在初始同步过程中丢失变更。
有关如何初始化客户端数据库的更多信息,请参见如何初始化客户端数据库和处理表架构。
应用程序版本控制
在应用程序开发和部署完毕后,可能还需要开发应用程序的新版本。对于应用程序的版本控制,需要考虑两个方面的问题:
受新版本影响的应用程序的各个部分
新版本是否必须与早期版本共存
通常,N 层应用程序更易于针对 Sync Framework 进行更新,因为可以单独更新服务器端组件和客户端组件。这样可使您公开包含已更新功能的新服务,并将客户端与服务器端变更隔离开,直到准备好对客户端组件进行更新。
N 层应用程序的版本控制
对于 Sync Framework,要考虑的主要应用程序更新是服务器数据库的架构变更。Sync Framework 不会将架构变更从服务器自动传播到客户端。但是,它支持架构变更,只要您更新了应用程序的相应部分。有关客户端数据库中支持的架构变更的列表,请参见处理表架构。如果在服务器数据库中进行架构变更,应该首先决定是否必须将其传播到客户端。例如,如果在服务器数据库中的一个表中添加了一个信用卡列,但是您的业务规则不允许雇员离线获取信用卡信息,您便不需要将架构变更传播到客户端。如果您决定传播架构变更,则具体的传播方式取决于变更的类型。
常见架构变更
两个最常见的架构变更是:向某个现有表添加列和添加一个新表,或者决定将一个原先不属于应用程序的现有表包括在内。如果应用程序需要同步一个新表,必须添加该表的 SyncAdapter。在服务器组件更新之后,客户端应用程序或应用程序的用户可以决定是否同步该新表。如果决定同步该新表,必须变更客户端组件以包括该新表的 SyncTable。这些变更必须以某种方式推送到每个客户端应用程序。ClickOnce 技术使您可以发布应用程序更新,然后应用程序在启动之前可以检查是否存在任何更新。如果向表中添加了一个新列并且想要同步该列,必须将该列添加到客户端数据库并更新用于同步变更的命令。对于添加新列之外的架构变更,请通过使用 Sync Framework 或其他机制,删除客户端上的表并重新创建它。
版本共存
在某些时候,客户端应用程序的新旧版本可能必须共存。在这种情况下,可以采取两种不同的方法:
维护服务器组件的多个版本,以便客户端组件的较旧版本可以继续访问服务器组件的相应版本。进行版本控制的最好方法是公开具有已更新功能的新服务。可以通过使用 ClickOnce 技术对客户端进行升级。升级完成后,会将客户端重定向到新的 Web 服务。
将客户端和服务器组件设计为使用一个应用程序版本参数。这种方法使客户端应用程序能够向服务器告知它需要的版本。请考虑以下示例,其中的存储过程从接受
@appversion
参数的服务器中选择插入。向 SelectIncrementalInsertsCommand 添加了一个参数,然后通过在 SyncAgent 中使用 SyncParameter 来提供值。在进行同步时,应用程序版本被发送给服务器,然后该存储过程选择正确的表架构版本。this.Configuration.SyncParameters.Add( new SyncParameter("@appversion", 1)); customerIncrUpdates.Parameters.Add("@appversion", SqlDbType.Int); Me.Configuration.SyncParameters.Add( _ New SyncParameter("@appversion", 1)) customerIncrUpdates.Parameters.Add("@appversion", SqlDbType.Int); CREATE PROCEDURE usp_CustomerSelectIncrementalInserts( @sync_last_received_anchor timestamp, @sync_new_received_anchor timestamp, @appversion int ) AS IF @appversion = 1 BEGIN SELECT CustomerId, CustomerName, SalesPerson FROM Sales.Customer WHERE InsertTimestamp > @sync_last_received_anchor AND InsertTimestamp <= @sync_new_received_anchor END ELSE IF @appversion = 2 BEGIN SELECT CustomerId, CustomerName, SalesPerson, CustomerType FROM Sales.Customer WHERE InsertTimestamp > @sync_last_received_anchor AND InsertTimestamp <= @sync_new_received_anchor END ELSE BEGIN PRINT('Unrecognized version') RETURN END