【问题标题】:Sync Framework scope filtering not working properly同步框架范围过滤无法正常工作
【发布时间】:2015-05-06 12:19:34
【问题描述】:

我为 POS(销售点)应用程序创建了一个同步应用程序。 一台服务器与多个终端相连。 服务器和终端数据库有 [pos_terminal] 表。它有 [POS_TERMINAL_ID] 列作为身份。 这就是我配置服务器的方式。

            try
        {
            string strScopeName = "";
            strScopeName = "TERMINAL_SCOPE_T01";

            SqlConnection serverConn = new SqlConnection(strServer_Connection);

            //pos_terminal

            DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(strScopeName);
            DbSyncTableDescription pos_terminal_Description = SqlSyncDescriptionBuilder.GetDescriptionForTable("pos_terminal", serverConn);
            scopeDesc.Tables.Add(pos_terminal_Description);

            SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);
            serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);

            serverProvision.ObjectSchema = "Sync";
            serverProvision.Tables["pos_terminal"].AddFilterColumn("POS_TERMINAL_ID");
            serverProvision.Tables["pos_terminal"].FilterClause = "[side].[POS_TERMINAL_ID]='T01'";

            if (serverProvision.ScopeExists(strScopeName))
            {
                return;
            }

            serverProvision.Apply();
            MessageBox.Show("Server provisioned with scope " + strScopeName);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());


        }

及以下,我如何配置终端数据库。

try
        {
            string strScopeName = "";
            strScopeName = "TERMINAL_SCOPE_T01";

            SqlConnection clientConn = new SqlConnection(strTerimal_Connection);
            SqlConnection serverConn = new SqlConnection(strServer_Connection);
            DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(strScopeName, null, "Sync", serverConn);
            SqlSyncScopeProvisioning clientProvision = new SqlSyncScopeProvisioning(clientConn, scopeDesc);


            clientProvision.ObjectSchema = "Sync";
            clientProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);

            if (clientProvision.ScopeExists(strScopeName))
            {
                return;
            }

            clientProvision.Apply();
            MessageBox.Show("Terminal provisioned with scope " + strScopeName);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

这些都是基本的过滤。

问题是,在 TERMINAL 01 中,当我将 POS_TERMINAL_ID 设置为“T01”(在过滤中)时,它运行良好,并且过滤后的数据与 [pos_terminal] 表同步。 但是在 TERMINAL 02 中,当我将 POS_TERMINAL_ID 设置为“T02”(在过滤中)时,数据与 T01 相关,但与 T02 无关。

在 TERMINAL 03 中发生同样的情况,(同步 T01,但不同步 T03)。

我已经单独测试过,只需在 2 个数据库中创建 2 个表并测试编码。编码工作正常。 在另一个表中存在对 [POS_TERMINAL_ID] 的外键引用。 我已将其删除并在 POS 数据库中进行了测试。但没有运气。

任何人有这种情况的解决方案?

谢谢

【问题讨论】:

    标签: c# sync microsoft-sync-framework


    【解决方案1】:

    如果要为新范围创建新存储过程,则应指定 SetCreateProceduresForAdditionalScopeDefault。否则,新作用域将简单地重用第一个作用域中的 selectchanges 存储过程。

    更好的是,使用范围模板而不是添加新的选择更改存储过程。

    通过link 详细了解同步框架配置...

    【讨论】:

    • 嗨 JuneT,谢谢您的回复。您的意思是在客户端数据库中设置 SetCreateProceduresForAdditionalScopeDefault 吗?
    • 服务器范围。那是您定义多个范围的地方。同样,如果您认为 GetDescriptionScope 会从服务器获取准确的范围定义,包括过滤器,答案是它不会从服务器获取过滤器定义。 GetDescriptionScope 将为您提供减去过滤器的范围定义。
    • 嗨 JuneT,我使用了模板而不是使用静态范围过滤。现在它可以工作了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多