Sync Framework 同步不同办公地点的过滤数据
Sync Framework Synchronization of filtered data on different office locations
我正在使用 Microsoft Sync Framework。它工作正常。但我需要的是:
我在不同的地点有 10 个中心。所有中心的数据都可以在一个集中位置获得。我将一个中心的数据与 FilterClause 同步,将另一个中心的数据与另一个 FilterClause 同步。它不显示任何错误,但在所有位置同步相同的数据;而不是相关的中心数据。
我使用的是:Microsoft Sync Framework、C# 和 Sql 服务器数据库:
编码如下:
try
{
var serverConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conOnline"].ConnectionString);
var clientConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conLocal"].ConnectionString);
string scopeName = tableName + CenterCode + "Scope";
var serverProvision = new SqlSyncScopeProvisioning(serverConn);
if (!serverProvision.ScopeExists(scopeName))
{
var serverScopeDesc = new DbSyncScopeDescription(scopeName);
var serverTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, serverConn);
serverScopeDesc.Tables.Add(serverTableDesc);
foreach (string key in KeyNames)
{
serverScopeDesc.Tables[tableName].Columns[key].IsPrimaryKey = true;
}
serverProvision.PopulateFromScopeDescription(serverScopeDesc);
serverProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
//filter
try
{
serverProvision.Tables[tableName].AddFilterColumn("cen_cd");
serverProvision.Tables[tableName].FilterClause = "[side].[cen_cd]='" + CenterCode + "'";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
serverProvision.Apply();
}
var clientProvision = new SqlSyncScopeProvisioning(clientConn);
if (!clientProvision.ScopeExists(scopeName))
{
var clientScopeDesc = new DbSyncScopeDescription(scopeName);
var clientTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, serverConn);
clientScopeDesc.Tables.Add(clientTableDesc);
foreach (string key in KeyNames)
{
clientScopeDesc.Tables[tableName].Columns[key].IsPrimaryKey = true;
}
clientProvision.PopulateFromScopeDescription(clientScopeDesc);
clientProvision.Apply();
}
var syncOrchestrator = new SyncOrchestrator();
//setup providers
var remoteProvider = new SqlSyncProvider(scopeName, serverConn);
syncOrchestrator.RemoteProvider = remoteProvider;
var localProvider = new SqlSyncProvider(scopeName, clientConn);
syncOrchestrator.LocalProvider = localProvider;
syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
var syncStats = syncOrchestrator.Synchronize();
}
catch (Exception ex)
{
string msg = "Error:\n" + ex.Message + "\n\nInner Exception:\n" + ex.InnerException;
MessageBox.Show(msg);
}
你能检查一下你的服务器有多少 *_selectchanges 存储过程对 table 以及它们是否有过滤器?
查看您的代码,您没有使用范围过滤器模板(使用过滤器创建模板范围并使用不同的过滤器值基于模板创建范围)。
并且因为您没有指定 SetCreateProceduresForAdditionalScopeDefault,所以您的所有范围都重新使用相同的 _selectchanges SP,而不是为每个范围创建一个新的。
我正在使用 Microsoft Sync Framework。它工作正常。但我需要的是: 我在不同的地点有 10 个中心。所有中心的数据都可以在一个集中位置获得。我将一个中心的数据与 FilterClause 同步,将另一个中心的数据与另一个 FilterClause 同步。它不显示任何错误,但在所有位置同步相同的数据;而不是相关的中心数据。
我使用的是:Microsoft Sync Framework、C# 和 Sql 服务器数据库:
编码如下:
try
{
var serverConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conOnline"].ConnectionString);
var clientConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conLocal"].ConnectionString);
string scopeName = tableName + CenterCode + "Scope";
var serverProvision = new SqlSyncScopeProvisioning(serverConn);
if (!serverProvision.ScopeExists(scopeName))
{
var serverScopeDesc = new DbSyncScopeDescription(scopeName);
var serverTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, serverConn);
serverScopeDesc.Tables.Add(serverTableDesc);
foreach (string key in KeyNames)
{
serverScopeDesc.Tables[tableName].Columns[key].IsPrimaryKey = true;
}
serverProvision.PopulateFromScopeDescription(serverScopeDesc);
serverProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
//filter
try
{
serverProvision.Tables[tableName].AddFilterColumn("cen_cd");
serverProvision.Tables[tableName].FilterClause = "[side].[cen_cd]='" + CenterCode + "'";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
serverProvision.Apply();
}
var clientProvision = new SqlSyncScopeProvisioning(clientConn);
if (!clientProvision.ScopeExists(scopeName))
{
var clientScopeDesc = new DbSyncScopeDescription(scopeName);
var clientTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, serverConn);
clientScopeDesc.Tables.Add(clientTableDesc);
foreach (string key in KeyNames)
{
clientScopeDesc.Tables[tableName].Columns[key].IsPrimaryKey = true;
}
clientProvision.PopulateFromScopeDescription(clientScopeDesc);
clientProvision.Apply();
}
var syncOrchestrator = new SyncOrchestrator();
//setup providers
var remoteProvider = new SqlSyncProvider(scopeName, serverConn);
syncOrchestrator.RemoteProvider = remoteProvider;
var localProvider = new SqlSyncProvider(scopeName, clientConn);
syncOrchestrator.LocalProvider = localProvider;
syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
var syncStats = syncOrchestrator.Synchronize();
}
catch (Exception ex)
{
string msg = "Error:\n" + ex.Message + "\n\nInner Exception:\n" + ex.InnerException;
MessageBox.Show(msg);
}
你能检查一下你的服务器有多少 *_selectchanges 存储过程对 table 以及它们是否有过滤器?
查看您的代码,您没有使用范围过滤器模板(使用过滤器创建模板范围并使用不同的过滤器值基于模板创建范围)。
并且因为您没有指定 SetCreateProceduresForAdditionalScopeDefault,所以您的所有范围都重新使用相同的 _selectchanges SP,而不是为每个范围创建一个新的。