从本地SQL Server数据库同步实时数据库&;C#

从本地SQL Server数据库同步实时数据库&;C#,c#,sql-server,entity-framework,replication,rmo,C#,Sql Server,Entity Framework,Replication,Rmo,我正在使用C#中的实体框架开发ASP.NET MVC应用程序。在这种情况下,我必须使用相同的模式创建两个数据库。一次一台PC正在使用应用程序并更新PC上的本地数据库 现在,我希望该本地数据库更新位于远程(实时)服务器上的另一个数据库。该更新将在触发后发生(我不希望在特定时间间隔后自动同步或同步) 我搜索了互联网,找到了类似的解决方案以及其他一些解决方案 大多数人都在使用复制管理对象(RMO)。我需要知道一些事情: 有没有其他简单的同步数据库的方法,或者我应该使用RMO 我可以为我的远程(实时)服

我正在使用C#中的实体框架开发ASP.NET MVC应用程序。在这种情况下,我必须使用相同的模式创建两个数据库。一次一台PC正在使用应用程序并更新PC上的本地数据库

现在,我希望该本地数据库更新位于远程(实时)服务器上的另一个数据库。该更新将在触发后发生(我不希望在特定时间间隔后自动同步或同步)

我搜索了互联网,找到了类似的解决方案以及其他一些解决方案

大多数人都在使用复制管理对象(RMO)。我需要知道一些事情:

  • 有没有其他简单的同步数据库的方法,或者我应该使用RMO
  • 我可以为我的远程(实时)服务器使用RMO吗
  • 服务器使用RMO的最低要求是什么
  • 在我的场景中,我应该创建推送订阅吗

  • 您可以搜索.NET同步框架 使用此框架,您可以创建3种方法

  • 对于服务器计算机或目标计算机
  • 用于客户端计算机或源计算机数据库
  • 同步方法
  • 根据您的选择,首先为客户端和服务器以及作用域名称创建连接字符串

    static string sServerConnection = 
        @"Data Source=192.168.1.112;Initial Catalog=Server;User ID=sa;Password=123456";
    
    static string sClientConnection = 
        @"Data Source=MAHAVEER;Initial Catalog=Client;Integrated Security=True";
    
    static string sScope = "MainScope";
    
    从客户机获取并存储数据

    //Get Data From Client Provision
    public static void ProvisionClient()
    {
        SqlConnection serverConn = new SqlConnection(sServerConnection);
        SqlConnection clientConn = new SqlConnection(sClientConnection);
    
        //Drop scope_Info Table
        string cmdText = @"IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES 
                   WHERE TABLE_NAME='scope_info') DROP table scope_info";
        clientConn.Open();
        SqlCommand cmd = new SqlCommand(cmdText, clientConn);
        cmd.ExecuteScalar();
        clientConn.Close();
    
    
        List<string> tables = new List<string>();
        tables.Add("Demo"); // Add Tables in List
        tables.Add("Product");
    
        var scopeDesc = new DbSyncScopeDescription("MainScope");
        foreach (var tbl in tables) //Add Tables in Scope
        {
            scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable(tbl, clientConn));
        }
    
        SqlSyncScopeProvisioning clientProvision = new SqlSyncScopeProvisioning(clientConn, scopeDesc); //Provisioning
    
        //skip creating the user tables
        clientProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);
    
        //skip creating the change tracking tables
        clientProvision.SetCreateTrackingTableDefault(DbSyncCreationOption.Skip);
    
        //skip creating the change tracking triggers
        clientProvision.SetCreateTriggersDefault(DbSyncCreationOption.Skip);
    
        //skip creating the insert/update/delete/selectrow SPs including those for metadata
        clientProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip);
    
        //create new SelectChanges SPs for selecting changes for the new scope
        //the new SelectChanges SPs will have a guid suffix
        clientProvision.SetCreateProceduresForAdditionalScopeDefault(DbSyncCreationOption.Create);
    
    
        clientProvision.Apply();
    }
    
    然后在main方法中调用上述三个方法。确保您必须以正确的方式调用这些方法,比如从客户机接收的第一个数据设置为服务器机,然后同步过程将启动

    static void Main(string[] args)
        {
            ProvisionClient();
            ProvisionServer();
            Sync();
        }
    

    我希望这对你有帮助,我在一个项目中使用了这段代码,对我来说效果很好。这仅适用于单客户端和单机同步进程,不适用于多客户端。

    可能有十几种复制方法。理想的方法取决于很多事情;是否需要用C语言完成?它需要更新到什么程度?每日的一分钟?您需要考虑不一致的连接吗?您的表中有多少条记录?您希望在更改窗口中有多少条记录?您是否拥有该架构,并且可以对其进行更改?
     public static void Sync()
    
        {
            SqlConnection serverConn = new SqlConnection(sServerConnection);
    
            SqlConnection clientConn = new SqlConnection(sClientConnection);
    
            SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
    
            syncOrchestrator.LocalProvider = new SqlSyncProvider(sScope, clientConn);
    
            syncOrchestrator.RemoteProvider = new SqlSyncProvider(sScope, serverConn);
    
            syncOrchestrator.Direction = SyncDirectionOrder.Upload;
    
            ((SqlSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
    
            SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
    
            Console.WriteLine("Start Time: " + syncStats.SyncStartTime);
    
            Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal);
    
            //Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal);
    
            Console.WriteLine("Complete Time: " + syncStats.SyncEndTime);
    
            Console.WriteLine(String.Empty);
    
            Console.ReadLine();
    
        }
    
        static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
    
        {
    
            Console.WriteLine(e.Conflict.Type);
    
            Console.WriteLine(e.Error);
    
        }
    
    static void Main(string[] args)
        {
            ProvisionClient();
            ProvisionServer();
            Sync();
        }