同步忽略过滤器

时间:2013-02-20 12:35:12

标签: c# ado.net microsoft-sync-framework data-synchronization smart-device

我正在尝试将Microsoft同步服务实现到我正在开发的智能设备应用程序中,但是我似乎遇到了障碍,我希望有人能够提供解决方案。我已设法实现同步,以便它下载表中的每个记录,但是我想过滤记录,因此只下载与用户相关的数据。为此,我在SelectIncrementalInsertsCommand中添加了一个 WHERE Operator.kde = @kde 子句,如下面的代码所示。

this.SelectIncrementalInsertsCommand.CommandText = @"IF @sync_initialized = 0 SELECT dbo.Operator.[OperatorID], [kde], [OperatorName], [Pass] FROM dbo.Operator LEFT OUTER JOIN CHANGETABLE(CHANGES dbo.Operator, @sync_last_received_anchor) CT ON CT.[OperatorID] = dbo.Operator.[OperatorID] WHERE dbo.Operator.[kde] = @kde AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary) ELSE  BEGIN SELECT dbo.Operator.[OperatorID], [kde], [OperatorName], [Pass] FROM dbo.Operator JOIN CHANGETABLE(CHANGES dbo.Operator, @sync_last_received_anchor) CT ON CT.[OperatorID] = dbo.Operator.[OperatorID] WHERE dbo.Operator.[kde] = @kde AND (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION  <= @sync_new_received_anchor AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary)); IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Operator')) > @sync_last_received_anchor RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. To recover from this error, the client must reinitialize its local database and try again',16,3,N'dbo.Operator')  END ";

然后我将@kde参数声明如下。

this.SelectIncrementalInsertsCommand.Parameters.Add(new System.Data.SqlClient.SqlParameter("@kde", System.Data.SqlDbType.Int));

要传入参数,我已将以下行添加到负责启动同步的代码中。

syncAgent.Configuration.SyncParameters.Add(new SyncParameter("@kde", kde));

注意:kde值是一个传递给我的同步方法的整数

尽管添加了这些过滤器,但同步过程似乎完全忽略了它们并为每个操作员下载了所有数据。我已经在线调查了这个问题,我的代码看起来与我读过的很多教程相同,但它仍然无法正常工作。

我是Sync Services的新手,所以如果有人能为我提供解决这个问题的信息和指导,我将非常感激

提前谢谢

2 个答案:

答案 0 :(得分:1)

你试过这个吗?

ADDING FILTER TO LOCAL DATABASE CACHE GENERATED SYNC

我建议您运行SQL事件探查器以查看传递给SQL Server的实际命令。

答案 1 :(得分:0)

我设法解决了这个问题,结果发现这是数据库上的一些“脏”记录,由于某种原因这些记录影响了同步。一旦我删除了这些记录,一切都按原样运作。