0

안녕하세요, 나는 2 개의 다른 데이터베이스와 테이블 및 columns.i 동기화 동기화 응용 프로그램을 만들었습니다. 동기화 프레임 워크를 사용하여 azure는 azure에서 호스팅합니다. 또한 내가 기사 아래에 읽었습니다 :어떻게 2 개의 다른 데이터베이스 테이블에서 다른 열의 이름을 동기화 할 수 있습니까?

http://jtabadero.wordpress.com/2011/08/19/part-4-synchronizing-tables-with-different-table-names-and-column-names/ http://www.devart.com/dotconnect/oracle/docs/SyncFramework.html
하지만 난 Nullreference 예외가 있습니다. OrderTable에 올바른 열이 없습니다. 사진을보세요. 이 문제를 해결하는 방법.

namespace WorkerRole1 
{ 
    public class WorkerRole : RoleEntryPoint 
    { 
     public override void Run() 
     { 
      // This is a sample worker implementation. Replace with your logic. 
      Trace.TraceInformation("WorkerRole1 entry point called", "Information"); 
      Setup(); 
      while (true) 
      { 
       Sync(); 
       Thread.Sleep(10000); 
       Trace.TraceInformation("Working", "Information"); 
      } 
     } 

    private void Setup() 
    { 

     string scopeName = "DifferentSchemaScope"; 
     string MemberSQLAzureConnectionString = ConfigurationManager.ConnectionStrings["MemberSQLAzureConnectionString"].ConnectionString; 
     string HubSQLAzureConnectionString = ConfigurationManager.ConnectionStrings["HubSQLAzureConnectionString"].ConnectionString; 
     using (SqlConnection sqlMemberAzureConn = new SqlConnection(MemberSQLAzureConnectionString)) 
     { 

      using (SqlConnection sqlHubAzureConn = new SqlConnection(HubSQLAzureConnectionString)) 
      { 


       if (sqlHubAzureConn.State == System.Data.ConnectionState.Open && sqlMemberAzureConn.State == ConnectionState.Open) 
       { 


        DbSyncScopeDescription myScope = new DbSyncScopeDescription(scopeName); 

        DbSyncTableDescription serverTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("myTest.SourceOrderTable", sqlHubAzureConn); 
        serverTableDesc.GlobalName = "OrderTable"; 

        DbSyncTableDescription clientTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("myTest.DestinationOrderTable", sqlMemberAzureConn); 


        clientTableDesc.GlobalName = "OrderTable"; 

        myScope.Tables.Add(serverTableDesc); 
        myScope.Tables.Add(clientTableDesc); 




        SqlSyncScopeProvisioning sqlServerProv = new SqlSyncScopeProvisioning(myScope); 
        SqlSyncScopeProvisioning sqlAzureProv = new SqlSyncScopeProvisioning(myScope); 

        sqlServerProv.PopulateFromScopeDescription(myScope); 




        myScope.Tables["OrderTable"].Columns.Remove(myScope.Tables["OrderTable"].Columns["OrderQty"]); 
        myScope.Tables["OrderTable"].Columns["OrderId"].IsPrimaryKey = true; 
        sqlAzureProv.PopulateFromScopeDescription(myScope); 



        if (!sqlServerProv.ScopeExists(scopeName, sqlHubAzureConn)) 
        { 

         sqlServerProv.Apply(sqlHubAzureConn); 

        } 

        // sqlAzureProv.SetCreateTableDefault(DbSyncCreationOption.Skip); 

        if (!sqlAzureProv.ScopeExists(scopeName, sqlMemberAzureConn)) 
        { 

         sqlAzureProv.Apply(sqlMemberAzureConn); 
        } 
       } 
      } 
     } 
    } 


    private void Sync() 
    { 

     string scopeName = "DifferentSchemaScope"; 
     string MemberSQLAzureConnectionString = ConfigurationManager.ConnectionStrings["MemberSQLAzureConnectionString"].ConnectionString; //CloudConfigurationManager.GetSetting("MemberSQLAzureConnectionString"); 
     string HubSQLAzureConnectionString = ConfigurationManager.ConnectionStrings["HubSQLAzureConnectionString"].ConnectionString; //CloudConfigurationManager.GetSetting("HubSQLAzureConnectionString"); 
     using (SqlConnection sqlMemberAzureConn = new SqlConnection(MemberSQLAzureConnectionString)) 
     { 

      using (SqlConnection sqlHubAzureConn = new SqlConnection(HubSQLAzureConnectionString)) 
      { 

       var localProvider = new SqlSyncProvider(scopeName, sqlHubAzureConn); 
       var remoteProvider = new SqlSyncProvider(scopeName, sqlMemberAzureConn); 

       remoteProvider.ChangesSelected += remoteProvider_ChangesSelected; 

       SyncOrchestrator syncOrchestrator = new SyncOrchestrator 
       { 
        LocalProvider = localProvider, 
        RemoteProvider = remoteProvider, 
        Direction = SyncDirectionOrder.UploadAndDownload 
       }; 

       syncOrchestrator.Synchronize(); 
      } 
     } 
    } 



    void remoteProvider_ChangesSelected(object sender, DbChangesSelectedEventArgs e) 
    { 
     if (e.Context.DataSet.Tables.Contains("OrderTable")) 
     { 
      DataTable dataTable = new DataTable(); 
      dataTable = e.Context.DataSet.Tables["OrderTable"]; 

      //rename the columns to match the destination table’s column names 
      dataTable.Columns["OrderId"].ColumnName = "OrderNo"; 
      dataTable.Columns["OrderDesc"].ColumnName = "OrderDetail"; 

     } 
    } 

    public override bool OnStart() 
    { 
     // Set the maximum number of concurrent connections 
     ServicePointManager.DefaultConnectionLimit = 12; 

     // For information on handling configuration changes 
     // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. 

     return base.OnStart(); 
    } 
} 

}

SQL :.

이드

스키마 MYTEST가

TABLE [MYTEST]을 만들기 .... 기본 키이어야한다 [SourceOrderTable ( [ OrderID] [int] IDENTITY (1,1) NULL이 아닌 [OrderDesc] nvarchar NULL)

CREATE TABLE [myTest].[DestinationOrderTable](
[OrderNo] [int] IDENTITY(1,1) NOT NULL, 
[OrderDetail] [nvarchar](50) NULL, 
[OrderQty] int NULL) 

하지만 작동하지 않습니다. 그것은 "무효 remoteProvider_ChangesSelected (개체를 보낸 사람, DbChangesSelectedEventArgs 전자)"remoteprovider 열 이름이 아닌 changed.remoteProvider 열 이름이 "OrderNo, OrderDetail"입니다 왜 그건에 오류가 발생하지만 "ORDERID, OrderDesc"모양 사진이어야합니다

enter image description here

ERROR 사진 :

enter image description here

+0

가능한 중복 이제까지*. –

+0

내 질문에 대한 오해. 이 문제를 해결하기에 충분한 정보가 있습니다. RemoteProvider 테이블에 orderid, orderdesc.WHY가 포함되어 있지 않습니다? 내 코드와 기사를 보았 니? – Penguen

+0

코드를 읽었습니다. 특별히 다음 행의 다른 것에 할당하기 때문에 특별한 이유없이'dataTable'을 생성합니다. –

답변

2

가 동기화 방향을 확인합니다. 업로드 및 다운로드라고 말하면 대상인 원격 공급자에서 ChangesSelected를 바인딩합니다.

이벤트가 다운로드시 실행되며 "대상"이 이제 소스입니다. 그래서 당신의 데이터 세트는 유효합니다. 변경 대상이 선택된 대상 테이블의 구조 (동기화 방향이 다운로드시 반전되기 때문에 현재 소스입니다)가 양방향 동기화를 수행하고 있기 때문에, ChangesSelected가 있어야합니다. 두 공급자의 이벤트.

로컬 업체 ChangesSelected지도한다 ORDERID -> OrderNo/OrderDesc-> OrderDetail

ChangesSelected이 있어야 원격 제공자 반대 OrderNo -> ORDERID/OrderDetail-> OrderDesc

* 모든 NullReferenceException이 질문의
+0

나는 리모컨에서만 변경을 원합니다. OrderNo -> OrderId/OrderDetail-> OrderDesc가 올바르지 않습니다. 너 좀 나 한테 줄 수있어? 그것은 나를 위해 정말로 중요합니다 .... – Penguen

+0

잠시 멈추고 당신이 원하는 것이 무엇인지 생각해보십시오. 위의 오류는 정확합니다. 원격 테이블에서 로컬 컬럼을 찾으려고합니다. 물론 그곳에 있지 않습니다. 단순히 업로드 하시겠습니까? 그런 다음 동기화 방향을 업로드로 설정하고 위에서 제안한대로 로컬 공급자를 변경합니다. 위의 모든 논리는 대상을 일치하도록 변경 내용을 선택한 후 열의 이름을 바꾸는 것입니다. – JuneT

+0

나는 그것을 만들었다. 하지만 작동하지 않습니다. 나는 목적지 만 업데이트하고 싶다. 하지만 매핑이 필요합니다 ... – Penguen