2012-12-16 3 views
0

나는 Sync Framework를 사용하여 일반 기능을 제공하는 래퍼를 작성했습니다. 질문으로 Sync Framework의 InvalidOperationException

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.Synchronization.Data; 
using Microsoft.Synchronization.Data.SqlServer; 
using System.Data.SqlClient; 
using Microsoft.Synchronization; 


namespace PluginTest.Components 
{ 
    public class P2PProvsionProvider 
    { 
     public SqlConnection RemoteConnection { get; set; } 
     public SqlConnection LocalConnection { get; set; } 
     private static Dictionary<string,DbSyncScopeDescription> scopes { get; set; } 
     private static SqlSyncScopeProvisioning remoteProvision { get; set; } 
     private static SqlSyncScopeProvisioning localProvision { get; set; } 

     private static P2PProvsionProvider provider; 

     //private P2PProvsionProvider() { 
     //} 

     public P2PProvsionProvider() { 
      scopes = new Dictionary<string, DbSyncScopeDescription>(); 
     } 

     public static P2PProvsionProvider getInstance(string name) { 
      if (name.Equals("default")) 
       if (provider == null) 
        provider = new P2PProvsionProvider(); 
      return provider; 
     } 
     //1 
     public void CreateProvisionScope(string name) { 
      if (!scopes.ContainsKey(name)) 
      { 
       scopes.Add(name, new DbSyncScopeDescription(name)); 
      } 
     } 

     //2 
     public void AddProvisionTable(string scopeName, string tableName) { 

      if (scopes[scopeName] != null) 
      { 
       DbSyncScopeDescription remoteScopeDesc = scopes[scopeName]; 
       //DbSyncScopeDescription localScopeDesc = scopes[scopeName]; 
       DbSyncTableDescription remoteTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, RemoteConnection); 
       //DbSyncTableDescription localTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, LocalConnection); 

       remoteScopeDesc.Tables.Add(remoteTableDesc); 
       //localScopeDesc.Tables.Add(localTableDesc); 

      } 
     } 

     //3 
     public void ApplyScopeProvisioning (string scopeName){ 

      remoteProvision = new SqlSyncScopeProvisioning(RemoteConnection, scopes[scopeName]); 
      remoteProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip); 
      remoteProvision.Apply(); 

      localProvision = new SqlSyncScopeProvisioning(LocalConnection, scopes[scopeName]); 
      localProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip); 
      localProvision.Apply(); 

     } 

     #region Scope Provisioning Builder methods 
     public SqlSyncScopeProvisioning BuilderCreateProcedures(DbSyncCreationOption option) 
     { 
      remoteProvision.SetCreateProceduresDefault(option); 
      return remoteProvision; 
     } 

     public SqlSyncScopeProvisioning BuilderCreateProceduresForAdditionalScope(DbSyncCreationOption option) 
     { 
      remoteProvision.SetCreateProceduresForAdditionalScopeDefault(option); 
      return remoteProvision; 
     } 

     public SqlSyncScopeProvisioning BuilderCreateTable(DbSyncCreationOption option) 
     { 
      remoteProvision.SetCreateTableDefault(option); 
      return remoteProvision; 
     } 

     public SqlSyncScopeProvisioning BuilderCreateTrackingTable(DbSyncCreationOption option) 
     { 
      remoteProvision.SetCreateTrackingTableDefault(option); 
      return remoteProvision; 
     } 

     public SqlSyncScopeProvisioning BuilderCreateTriggers(DbSyncCreationOption option) 
     { 
      remoteProvision.SetCreateTriggersDefault(option); 
      return remoteProvision; 
     } 

     public SqlSyncScopeProvisioning BuilderPopulateTrackingTable(DbSyncCreationOption option) 
     { 
      remoteProvision.SetPopulateTrackingTableDefault(option); 
      return remoteProvision; 
     } 

     public SqlSyncScopeProvisioning BuilderUseBulkProcedures(bool useBulk) 
     { 
      remoteProvision.SetUseBulkProceduresDefault(useBulk); 
      return remoteProvision; 
     } 
     #endregion 
     //4 


     public SyncOperationStatistics ExecuteSync(string scopeName , SyncDirectionOrder direction = SyncDirectionOrder.UploadAndDownload) { 

      SyncOrchestrator syncOrachestrator = new SyncOrchestrator() { 
       LocalProvider = new SqlSyncProvider(scopeName, LocalConnection), 
       RemoteProvider = new SqlSyncProvider(scopeName, RemoteConnection), 
       Direction = direction 
      }; 

      ((SqlSyncProvider)syncOrachestrator.LocalProvider).ApplyChangeFailed += (s,e) => 
      { 

      }; 

      return syncOrachestrator.Synchronize(); 
     } 

     //5 Deprovision certain scope 
     public void DeprovisionScope(SqlConnection conn, string scopeName) { 
      SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(conn); 
      deprovisionScope.DeprovisionScope(scopeName); 
     } 

     //6 Deprovision All 
     public void DeprovisionStore(SqlConnection conn) 
     { 
      SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(conn); 
      deprovisionScope.DeprovisionStore(); 
     } 
    } 
} 

내가 몇 가지 저장 프로 시저가 존재하지 않는다고 말하는 것을 말하는 InvalidOperationException이 무엇입니까 제안 :

내 코드입니다. 다음과 같이 응용 프로그램은 작동합니다 "는 조항의 범위를 추가"텍스트가있는 버튼을 사용자가 클릭이 완료 다음 경우 양식

public GlobalFramework.Core core { get; set; } 
    public BindingList<string> addedTables { get; set; } 
    public BindingList<string> provisionedTables { get; set; } 
    public P2PProvsionProvider provider { get; set; } 
    public SyncOperationStatistics stats { get; set; } 

1에 다음과 같은 정의를 제공 :

private void provisionButton_Click(object sender, EventArgs e) 
    { 
     provider.CreateProvisionScope(provisionScopeTextBox.Text); 
     foreach (var item in provisionedTables) 
     { 
      provider.AddProvisionTable(provisionScopeTextBox.Text, item); 
     } 

    } 

2- 사용자는 "조항 적용"으로 버튼을 클릭하면

private void applyProvisionButton_Click(object sender, EventArgs e) 
    { 
     provider.ApplyScopeProvisioning(provisionScopeTextBox.Text); 
    } 

-3-

을 수행하면 다음 버튼 w 사용자가 클릭 i "동기화"를 수행하면 다음이 수행됩니다.

private void syncButton_Click(object sender, EventArgs e) 
    { 
     stats = provider.ExecuteSync(provisionScopeTextBox.Text); 
     statsLabel.Text = "Start time: " + stats.SyncStartTime + "End Time: " +stats.SyncEndTime+ "Change Total: "+stats.DownloadChangesTotal; 
    } 

이제이 예외가 계속 발생하는 이유는 무엇입니까? 로컬 데이터베이스 연결이 SQL Server 2008 R2입니다. 원격 데이터베이스도 SQL Server 2008 R2입니다.

P.S : 범위를 한 번만 지정해야한다는 것을 알고 있습니다.

답변

1

왜 저장 프로 시저 생성을 건너 뛰고 있습니까?

remoteProvision.SetCreateProceduresDefault (DbSyncCreationOption.Skip); localProvision.SetCreateProceduresDefault (DbSyncCreationOption.Skip);

테이블이 이전에 프로비저닝되었고 이미 저장된 procs를 저장했다면 생성을 건너 뛰면됩니다.

+0

Thx. 이제 CreateOrUseExisiting 옵션을 사용하고 있습니다. –

관련 문제