0

Я использую Microsoft Sync Framework v2.1 для синхронизации двух баз данных, то есть от удаленных (ms sql server 2012) до локальных (ms sql server express 2008 R2). Таблицы могут быть успешно созданы в локальной базе данных, однако данные не синхронизируются из-за следующей ошибки:Ошибка Microsoft Sync Framework

Текущая операция не может быть выполнена, поскольку база данных не предоставляется для синхронизации или у вас нет разрешений для таблиц конфигурации синхронизации.

Однако при синхронизации 2 локальных баз данных (с использованием ms sql server express 2008 R2) синхронизация прошла успешно.

У кого-нибудь есть какие-либо предложения относительно проблемы?

Спасибо.

КОД

Ниже приводится основная форма:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // create a connection to the SyncExpressDB database 
      string clientConn = ConfigurationManager.ConnectionStrings["ianConnection"].ConnectionString; 

      // create a connection to the SyncDB server database 
      string serverConn = ConfigurationManager.ConnectionStrings["arvixeConnection"].ConnectionString; 

      Utilities.Synchronisation.Db.DBSynchroniser dbSync = new DBSynchroniser(clientConn, serverConn); 
      dbSync.ProvisionSyncScope("TestScope", "Products", DBSyncSide.Both); 
      dbSync.Sync(Microsoft.Synchronization.SyncDirectionOrder.Download, "TestScope"); 
      label1.Text = "Sync Done !!!"; 
     } 
    } 

Ниже приведен класс синхронизации

public class DBSynchroniser 
    { 
     SqlConnection clientConnection; 
     SqlConnection serverConnection; 

     SyncOrchestrator syncOrchestrator; 

     private EventHandler<DbApplyChangeFailedEventArgs> changeFailedHandler; 
     public EventHandler<DbApplyChangeFailedEventArgs> ChangeFailedHandler 
     { 
      get { return changeFailedHandler; } 
      set { changeFailedHandler = value; } 
     } 

     public DBSynchroniser(string clientConn, string serverConn) 
     { 
      clientConnection = new SqlConnection(clientConn); 
      serverConnection = new SqlConnection(serverConn); 

      syncOrchestrator = new SyncOrchestrator(); 
      changeFailedHandler = new EventHandler<DbApplyChangeFailedEventArgs>(ApplyChangeFailed); 
     } 

     public void ProvisionSyncScope(string syncScopeName, string tableName, DBSyncSide syncSide) 
     { 
      ProvisionSyncScope(syncScopeName, new List<string>(new string[] { tableName }), syncSide); 
     } 


     public void ProvisionSyncScope(string syncScopeName, List<string> tableNames, DBSyncSide syncSide) 
     { 

      DbSyncScopeDescription scopeDesc; 
      // define a new scope 
      scopeDesc = new DbSyncScopeDescription(syncScopeName); 
      scopeDesc.UserComment = "This is to test the sync class"; 

      foreach (string name in tableNames) 
      { 
       // get the description of the table name 
       // and add the table description to the sync scope definition 
       scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable(name, serverConnection)); 
      } 

      // create a server scope provisioning object based on the ProductScope 
      SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConnection, scopeDesc); 
      SqlSyncScopeProvisioning clientProvision = new SqlSyncScopeProvisioning(clientConnection, scopeDesc); 

      // skipping the creation of table since table already exists on server 
      serverProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting); 
      clientProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting); 

      // start the provisioning process 
      switch (syncSide) 
      { 
       case DBSyncSide.Client: 
        clientProvision.Apply(); 
        break; 
       case DBSyncSide.Server: 
        serverProvision.Apply(); 
        break; 
       case DBSyncSide.Both: 
        serverProvision.Apply(); 
        clientProvision.Apply(); 
        break; 
       default: 
        break; 
      } 

     } 

     public void DeprovisionScope(string scopeName, DBSyncSide syncSide) 
     { 
      SqlSyncScopeDeprovisioning clientSqlDepro = new SqlSyncScopeDeprovisioning(clientConnection); 
      SqlSyncScopeDeprovisioning serverSqlDepro = new SqlSyncScopeDeprovisioning(serverConnection); 

      // First save the deprovisioning script so it can be run on other SQL Server client databases. 
      // This step is optional. 
      //File.WriteAllText("SampleDeprovisionScript.txt", clientSqlDepro.ScriptDeprovisionScope(scopeName)); 

      // Remove the scope. 
      switch (syncSide) 
      { 
       case DBSyncSide.Client: 
        clientSqlDepro.DeprovisionScope(scopeName); 
        break; 
       case DBSyncSide.Server: 
        serverSqlDepro.DeprovisionScope(scopeName); 
        break; 
       case DBSyncSide.Both: 
        clientSqlDepro.DeprovisionScope(scopeName); 
        serverSqlDepro.DeprovisionScope(scopeName); 
        break; 
       default: 
        break; 
      } 

     } 

     public DBSyncOperationStatistics Sync(SyncDirectionOrder direction, string syncScopeName) 
     { 
      // set local provider of orchestrator to a sync provider associated with the 
      // MySyncScope in the client database 
      syncOrchestrator.LocalProvider = new SqlSyncProvider(syncScopeName, clientConnection); //check objectPrefix and schema 

      // set the remote provider of orchestrator to a server sync provider associated with 
      // the MySyncScope in the server database 
      syncOrchestrator.RemoteProvider = new SqlSyncProvider(syncScopeName, serverConnection); //check objectPrefix and schema 

      // set the direction of sync session to Upload and Download 
      syncOrchestrator.Direction = direction; 

      // subscribe for errors that occur when applying changes to the client 
      ((SqlSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += changeFailedHandler; 

      // execute the synchronization process 
      DBSyncOperationStatistics syncStats = new DBSyncOperationStatistics(syncOrchestrator.Synchronize()); 

      //return statistics of synchronisation 
      return syncStats; 
     } 



     private void ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e) 
     { 
      throw e.Error; 
     } 


     ~DBSynchroniser() 
     { 
      if (clientConnection.State == System.Data.ConnectionState.Open) 
      { 
       clientConnection.Close(); 
       clientConnection.Dispose(); 
      } 

      if (serverConnection.State == System.Data.ConnectionState.Open) 
      { 
       serverConnection.Close(); 
       serverConnection.Dispose(); 
      } 
     } 
    } 
+0

Предоставляете ли вы базу данных на сервере? Обычно я выполняю функцию PerformPostRestoreFixup после перемещения данных на сервер, а затем предоставляю базу данных на сервере. – PeterJ

+0

Вы используете схему non-dbo? – JuneT

+0

Я не эксперт в базе данных, но я думаю, что использую схему dbo, так как у каждого имени таблицы перед ним есть dbo (пример: dbo.Users, dbo.Towns). Я поставил вопрос, потому что все необходимые поля, такие как schema.info, tableName.tracking и т. Д., Создаются в обеих базах данных. Однако я не могу перенести данные из удаленной базы данных в локальную базу данных. В следующем комментарии я отправлю код, использующий для синхронизации – user3206587

ответ

2

Я решил эту проблему. Как я думал, это была проблема, связанная с схемой. Я указал правильные схемы, поскольку схема удаленной базы данных отличается от локальной, и проблема решена. Спасибо за вашу помощь.

+0

Можете ли вы поделиться мной с кодом, поскольку я хочу, чтобы структура синхронизации работала, но не знаю, как это сделать –

0

У меня была такая же проблема Как Уважаемый user3206587 упоминалось мы должны изменить Шма пользователя на dbo , потому что если таблица префиксов становятся другими мы столкнемся с инициализации или разрешения ошибки, например enter code here dbo.tblTest отличается от sampleUser.tblTest вы должны поменять по умолчанию shema на dbo для образца пользователя на сервере. точно так же, как ваша локальная база данных enter image description here

Смежные вопросы