2010-11-18 4 views
0

Je tente d'apprendre le framework de synchronisation. J'ai suivi pas à pas la documentation MSDN et cela n'a pas fonctionné. Surpris?! Ce dont j'ai besoin est de synchroniser une base de données SQL Express avec la base de données SQL Express. En lisant sur l'approvisionnement et d'autres préparatifs que je dois faire, je ne pourrais jamais trouver si cela doit être exécuté chaque fois que je veux utiliser la synchronisation. Je veux dire, provision -> sync -> deprovision. Une autre chose est que je reçois cette étrange exception en faisant étape par étape l'échantillon MSDN. DbProvisioningException "MomScope" existe déjà ... ne devrait pas exister?Sync Framework DbProvisioningException

code:

private void InitializeSync() 
{ 
    SqlConnection sourceConn = new SqlConnection(ConfigManager.Config.SourceSyncConnectionString); 
    SqlConnection myConn = new SqlConnection(ConfigManager.Config.ConnectionString); 

    #region SET SOURCE PROVIDER 

    SqlSyncProvider sourceSqlProv = new SqlSyncProvider("MomSync", sourceConn); 

    DbSyncScopeDescription sourceScope = new DbSyncScopeDescription("MomScope"); 

    DbSyncTableDescription productsSourceTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Mom_Products", sourceConn); 
    DbSyncTableDescription customersSourceTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Mom_Customer", sourceConn); 
    DbSyncTableDescription ordersSourceTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Mom_Orders", sourceConn); 
    DbSyncTableDescription paymentsSourceTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Mom_Payments", sourceConn); 

    sourceScope.Tables.Add(productsSourceTableDesc); 
    sourceScope.Tables.Add(customersSourceTableDesc); 
    sourceScope.Tables.Add(ordersSourceTableDesc); 
    sourceScope.Tables.Add(paymentsSourceTableDesc); 

    SqlSyncScopeProvisioning sourceProvision = new SqlSyncScopeProvisioning(sourceConn, sourceScope); 
    sourceProvision.SetCreateTableDefault(DbSyncCreationOption.Skip); 

    try 
    { 
     sourceProvision.Apply(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    #endregion 

    #region SET MY PROVIDER 

    SqlSyncProvider myProvider = new SqlSyncProvider("MomSync", myConn); 

    DbSyncScopeDescription scopeSourceDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope("MomScope", sourceConn); <===== DbProvisioningException (MomScope already exists????) 
    SqlSyncScopeProvisioning myProvision = new SqlSyncScopeProvisioning(myConn, scopeSourceDesc); 

    try 
    { 
     myProvision.Apply(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    #endregion 

    #region SET SYNC ORCHESTRATOR 

    OrcheStrator = new SyncOrchestrator 
         { 
          LocalProvider = myProvider, 
          RemoteProvider = sourceSqlProv, 
          Direction = SyncDirectionOrder.UploadAndDownload 
         }; 

    ((SqlSyncProvider)OrcheStrator.LocalProvider).ApplyChangeFailed += ApplyChangeFailedHandler; 

    #endregion 
} 

Tous les échantillons de synchronisation appropriés? Donc, je peux comprendre correctement comment créer cette tâche?

Merci.

Répondre

0

Vous n'avez pas besoin de provision à chaque fois avant la synchronisation. La provision peut être une fois et vous pouvez ensuite synchroniser à partir de là. Bien sûr, si la désapprovisionnement se produit à la fois, cela peut être fait après cela.

Dans votre cas, comme le suggère le message, il semble déjà exister avec le même nom. Vérifiez en cours d'exécution après la déclaration

select * from scope_info 

Si elle renvoie des lignes avec le nom de champ que vous essayez d'ajouter, vous pouvez faire les choses suivantes.

  1. Désactivez les DB pour cette portée. Mais vous devez vous assurer que la portée n'est pas utilisée par quelqu'un d'autre.

(OR)

  1. Mise à disposition de la DB avec un nom différent
Questions connexes