如何仅同步数据库中的某些行

时间:2014-11-18 14:32:32

标签: c# sql-server sql-server-ce sync microsoft-sync-framework

我正在尝试将中心(sql-server)数据库 dbA 中的几个表同步到本地(sql-ce)客户端数据库 dbB 。为此,我计划使用Microsoft同步框架。我已经设法让它工作到目前为止同步一些指定表中的所有行(或更新的行)。

但是,我的 dbA 包含非常多的数据,并且它也在增长,因此我不希望客户拥有 dbA 的完整副本在他们的本地数据库。相反,我只是希望他们拥有数据库的某些部分(某些行取决于某些表达式,例如来自 tableA 只选择 moduleId = 4 的行)

所以最初我认为过滤器似乎对我而言。特别是基于参数的过滤器,我可以在其中指定过滤器的参数。然而,经过一些调查后,似乎在创建基于参数的过滤器时,实际上只是创建一个模板,然后从中创建不同的范围。

我无法准确描述我的应用程序的功能,但您几乎可以将其视为版本处理系统,参数将代表我想要选择的版本。所以你可以看到它会成为大量的范围。

所以最后,我的选择是什么?

1 个答案:

答案 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。

希望这有帮助。

特拉维斯