我正在尝试将中心(sql-server)数据库 dbA 中的几个表同步到本地(sql-ce)客户端数据库 dbB 。为此,我计划使用Microsoft同步框架。我已经设法让它工作到目前为止同步一些指定表中的所有行(或更新的行)。
但是,我的 dbA 包含非常多的数据,并且它也在增长,因此我不希望客户拥有 dbA 的完整副本在他们的本地数据库。相反,我只是希望他们拥有数据库的某些部分(某些行取决于某些表达式,例如来自 tableA 只选择 moduleId = 4 的行)
所以最初我认为过滤器似乎对我而言。特别是基于参数的过滤器,我可以在其中指定过滤器的参数。然而,经过一些调查后,似乎在创建基于参数的过滤器时,实际上只是创建一个模板,然后从中创建不同的范围。
我无法准确描述我的应用程序的功能,但您几乎可以将其视为版本处理系统,参数将代表我想要选择的版本。所以你可以看到它会成为大量的范围。
所以最后,我的选择是什么?
答案 0 :(得分:2)
你可以使用SQL函数作为filter-parameter,这样可以改变吗?
像
这样的东西serverTemplate.Tables["tableA"].AddFilterColumn("ModuleId");
serverTemplate.Tables["tableA"].FilterClause = "[side].[ModuleId] = sf_GetCurrentModule()";
您可以创建一个SQL函数sf_GetCurrentModule()来返回要同步的ModuleId。如果要同步的行因客户端而异,那么每个客户端至少需要一个同步范围 - 这不是问题,只需使用范围的唯一名称,并可能将id从客户端传递给函数:
serverTemplate.Tables["tableA"].FilterClause = string.Format("[side].[ModuleId] = sf_GetCurrentModule({0})", ClientId);
因此,您可以根据客户端返回要同步的ModuleId。
希望这有帮助。
特拉维斯