【问题标题】:How to synchronize 2 tables which have got different Columns by using Sync FrameWork?如何使用 Sync FrameWork 同步具有不同列的 2 个表?
【发布时间】:2014-04-17 12:56:26
【问题描述】:

我一直在使用 SYNC 框架来合并 2 个不同的数据库。如果我的数据库是相同的列,这很简单。我可以轻松地相互匹配和同步。但是,如果我在有一些不常见列的表中添加和删除一些列。同步也无法捕获列匹配。 请不要给我文章链接。我一直在阅读所有这些。

下面是我的愿望:

http://jtabadero.wordpress.com/2011/08/19/part-4-synchronizing-tables-with-different-table-names-and-column-names/

我的 SQL 脚本:


GO

CREATE TABLE [dbo].[Customer](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [SurName] [nvarchar](50) NULL,
    [Age] [int] NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

USE [clientDb3]
GO

/****** Object:  Table [dbo].[Customer]    Script Date: 4/17/2014 10:15:45 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Customer](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [SurName] [nvarchar](50) NULL,
    [Description] [nvarchar](50) NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


C#:


namespace syncSample1
{
    class Program
    {
        static void Main(string[] args)
        {
            string serverConn = @"data source=H2014-008\SQLEXPRESS;initial catalog=serverDb3;integrated security=True;MultipleActiveResultSets=True;";
            string clientConn = @"data source=H2014-008\SQLEXPRESS;initial catalog=clientDb3;integrated security=True;MultipleActiveResultSets=True;";

            using (var serverConnection = new SqlConnection(serverConn))
            using(var clientConnection = new SqlConnection(clientConn))
            {

                var provider1 = new SqlSyncProvider("scopeTest",serverConnection);
                var provider2 = new SqlSyncProvider("scopeTest",clientConnection);


                //config

                PrepareServerForProvisioning(provider1);
                PrepareClientForProvisioning(provider2, serverConnection);

               //sync
                SyncOrchestrator sync = new SyncOrchestrator();
                sync.LocalProvider= provider1;
                sync.RemoteProvider=provider2;
                sync.Direction = SyncDirectionOrder.UploadAndDownload;
                sync.Synchronize();

                Console.Read();

            }


        }

        private static void PrepareServerForProvisioning(SqlSyncProvider provider)
        {
            SqlConnection connection = (SqlConnection)provider.Connection;
            SqlSyncScopeProvisioning config = new SqlSyncScopeProvisioning(connection);
            if (!config.ScopeExists(provider.ScopeName))
            {
                DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(provider.ScopeName);
                scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable("Customer", connection));
                DbSyncTableDescription serverTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Customer", connection);
                serverTableDesc.GlobalName = "CustomerTable";
                config.PopulateFromScopeDescription(scopeDesc);
                config.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
                config.Apply();

            }


        }

        private static void PrepareClientForProvisioning(SqlSyncProvider provider, SqlConnection sourceConnection)
        {
            SqlSyncScopeProvisioning config = new SqlSyncScopeProvisioning((SqlConnection)provider.Connection);
            if (!config.ScopeExists(provider.ScopeName))
            {
                DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(provider.ScopeName, sourceConnection);
                scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable("Customer", sourceConnection));
                config.PopulateFromScopeDescription(scopeDesc);
                config.Apply();

            }

        }


    }
}

【问题讨论】:

    标签: c# visual-studio synchronization sync microsoft-sync-framework


    【解决方案1】:

    您想要实现的目标并没有什么特别之处。这是开箱即用的支持。配置表时,您可以指定要包含的列。您可以在代码中指定应为每个表添加哪些特定列。在上面的代码中,您使用 GetDescriptionForTable 来获取所有列。您可以保留相同的代码,只需删除要排除的列。这种方法在您上面引用的同一篇博文中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多