Sync Framework 范围过滤无法正常工作
Sync Framework scope filtering not working properly
我已经为 POS(销售点)应用程序创建了一个同步应用程序。
一台服务器与多个终端相连。
服务器和终端数据库有 [pos_terminal] table。它有 [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] table。
但是在 TERMINAL 02 中,当我将 POS_TERMINAL_ID 设置为 "T02"(在过滤中)时,数据会同步到 T01,而不是 T02。
同样发生在 TERMINAL 03,(同步 T01,但不是 T03)。
我已经分别测试过,只需在 2 个数据库中创建 2 tables 并测试编码。编码工作正常。
在另一个 table 到 [POS_TERMINAL_ID] 中有一个外键引用。
我已经删除它并在 POS 数据库中进行了测试。但运气不好。
有人对这种情况有解决方案吗?
谢谢
如果要为新范围创建新存储过程,则应指定 SetCreateProceduresForAdditionalScopeDefault。否则,新作用域将简单地重用第一个作用域中的 selectchanges 存储过程。
最好使用作用域模板而不是添加新的 select 更改存储过程。
通过此link 详细了解同步框架配置...
我已经为 POS(销售点)应用程序创建了一个同步应用程序。 一台服务器与多个终端相连。 服务器和终端数据库有 [pos_terminal] table。它有 [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] table。 但是在 TERMINAL 02 中,当我将 POS_TERMINAL_ID 设置为 "T02"(在过滤中)时,数据会同步到 T01,而不是 T02。
同样发生在 TERMINAL 03,(同步 T01,但不是 T03)。
我已经分别测试过,只需在 2 个数据库中创建 2 tables 并测试编码。编码工作正常。 在另一个 table 到 [POS_TERMINAL_ID] 中有一个外键引用。 我已经删除它并在 POS 数据库中进行了测试。但运气不好。
有人对这种情况有解决方案吗?
谢谢
如果要为新范围创建新存储过程,则应指定 SetCreateProceduresForAdditionalScopeDefault。否则,新作用域将简单地重用第一个作用域中的 selectchanges 存储过程。
最好使用作用域模板而不是添加新的 select 更改存储过程。
通过此link 详细了解同步框架配置...