다음을 통해 공유


연습: 동기화 실행[SQL Express]

이전 두 연습에서는 동기화를 위한 서버 데이터베이스 SyncDB 및 Compact 데이터베이스 SyncCompactDB를 준비했습니다. 이 연습에서는 이러한 두 데이터베이스 사이의 동기화 프로세스를 시작하는 콘솔 응용 프로그램을 만듭니다. 서버/클라이언트 프로비전 및 동기화 프로세스 실행에 대한 보다 자세한 기술 정보는 방법: 데이터베이스 동기화 구성 및 실행(SQL Server)을 참조하십시오.

동기화를 실행하려면

  1. Visual Studio솔루션 탐색기에서 **솔루션 ‘SyncSQLServerAndSQLExpress’**를 마우스 오른쪽 단추로 클릭하고, 추가를 가리키고, 새 프로젝트를 클릭합니다.

  2. 프로젝트 형식에서 **Visual C#**을 선택하고 템플릿에서 콘솔 응용 프로그램을 선택합니다.

  3. 프로젝트 이름에 ExecuteExpressSync를 입력합니다.

  4. 확인을 클릭하여 새 프로젝트 대화 상자를 닫습니다.

  5. 솔루션 탐색기 창에서 ExecuteExpressSync를 마우스 오른쪽 단추로 클릭하고 참조 추가를 클릭합니다.

  6. Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer를 선택하고 확인을 클릭하여 참조 추가 대화 상자를 닫습니다.

  7. Program.cs 파일 시작 부분에서 기존 using 문 다음에 아래의 using 문을 추가합니다.

    using System.Data;
    using System.Data.SqlClient;
    
    using Microsoft.Synchronization;
    using Microsoft.Synchronization.Data;
    using Microsoft.Synchronization.Data.SqlServer;
    
  8. 다음 문을 Main 메서드에 추가하여 Express 데이터베이스에 대한 SQL 연결을 만듭니다.

    SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");
    
  9. 다음 문을 Main 메서드에 추가하여 서버 데이터베이스에 대한 SQL 연결을 만듭니다.

    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
    

    중요

    기본 인스턴스를 사용하지 않는 경우 위의 문에서 서버 이름을 사용자 서버의 인스턴스 이름으로 바꿉니다. 예를 들어 SQL Server 인스턴스의 이름이 MYSQLINSTANCE인 경우 (로컬)을 .\MYSQLINSTANCE로 바꿉니다.

  10. 다음 문을 Main 메서드에 추가하여 동기화 조정자를 만듭니다. 이 코드에서는 동기화 조정자를 만들고, 동기화 조정자의 로컬 공급자를 Express 데이터베이스와 연결된 공급자 개체로 설정하고, 동기화 조정자의 원격 공급자를 서버 데이터베이스와 연결된 공급자 개체로 설정하고, 동기화 세션의 방향을 업로드-및-다운로드로 설정합니다.

    1. SyncOrchestrator 클래스의 인스턴스를 만듭니다. SyncOrchestrator 클래스는 동기화 세션을 시작하고 제어합니다.

    2. 동기화 조정자 개체의 로컬 공급자를 SyncExpressDB 클라이언트 데이터베이스와 연결된 SqlSyncProvider 개체로 설정합니다. SqlSyncProvider 클래스는 클라이언트와 통신하며 동기화 조정자가 클라이언트 데이터베이스의 구체적인 구현에 관계없이 작동하게 해 주는 SQL Express 데이터베이스에 대한 동기화 공급자를 캡슐화합니다.

    3. 동기화 조정자의 원격 공급자를 SyncDB 서버 데이터베이스와 연결된 SqlSyncProvider 개체로 설정합니다. SqlSyncProvider 클래스는 SQL Server 데이터베이스와 통신하며 다른 Sync Framework 구성 요소가 데이터베이스의 구체적인 구현에 관계없이 작동하게 해 주는 동기화 공급자를 나타냅니다.

    4. 클라이언트가 서버에서 변경 내용을 다운로드/업로드할 수 있도록 동기화 조정자 개체의 동기화 방향을 UploadAndDownload로 설정합니다.

    // create the sync orhcestrator
    SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
    
    // set local provider of orchestrator to a sync provider associated with the 
    // ProductsScope in the SyncExpressDB express client database
    syncOrchestrator.LocalProvider = new SqlSyncProvider("ProductsScope", clientConn);
    
    // set the remote provider of orchestrator to a server sync provider associated with
    // the ProductsScope in the SyncDB server database
    syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);
    
    // set the direction of sync session to Upload and Download
    syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
    
  11. 다음 코드를 추가하여 클라이언트에 변경 내용을 적용할 때 발생하는 오류를 구독합니다. ApplyChangeFailed 이벤트는 클라이언트에서 행이 적용될 수 없으면 발생합니다. 이 연습 뒷부분에서 오류 이벤트에 대한 처리기를 정의할 것입니다.

    // subscribe for errors that occur when applying changes to the client
    ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
    
  12. Main 메서드에 다음 문을 추가합니다. 이 코드는 SyncOrchestrator 개체에서 Synchronize() 메서드를 호출하여 SyncDB 서버 데이터베이스와 SyncExpressDB Express 데이터베이스 사이의 동기화 프로세스를 시작합니다.

    // execute the synchronization process
    SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
    
  13. Main 메서드에 다음 문을 추가하여 Synchronize() 메서드에서 반환된 통계를 표시합니다. 이 메서드에서 반환된 SyncOperationStatistics 개체에는 실행된 동기화 세션에 대한 통계가 포함되어 있습니다.

    // print statistics
    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);
    
  14. Main 메서드 다음에 Program 클래스에 대한 다음 이벤트 처리기 메서드를 추가하여 ApplyChangeFailed 이벤트를 처리합니다. DbApplyChangeFailedEventArgs 매개 변수는 실패의 원인인 충돌이나 오류에 대한 정보를 제공합니다. 이벤트 처리기에서 동기화 공급자가 행을 다시 적용해야 할지 여부를 지정하는 등의 몇 가지 방법으로 이벤트에 응답할 수 있습니다. 개체의 Error 속성에는 동기화 중에 발생한 예외에 대한 메타데이터가 포함되어 있습니다. 다음 예제 코드는 이 오류와 동기화 중 발생한 충돌의 유형(DbConflictType 유형)을 표시합니다.

    static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
    {
        // display conflict type
        Console.WriteLine(e.Conflict.Type);
    
        // display error message 
        Console.WriteLine(e.Error);
    }
    
  15. 솔루션 탐색기에서 ExecuteExpressSync를 마우스 오른쪽 단추로 클릭하고 빌드를 선택합니다.

  16. 솔루션 탐색기에서 ProvisionServerWithFilteredScope를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.

    경고

    이 단계를 수행하지 않고 Ctrl+F5를 다시 누르는 경우 ProvisionClient 응용 프로그램이 다시 실행되고 클라이언트 데이터베이스에 이미 있는 범위에 대한 오류 메시지가 표시됩니다.

  17. Ctrl+F5를 눌러 프로그램을 실행합니다. 출력은 다음과 같은 형태가 됩니다.

    Start Time: 6/14/2010 6:24:19 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 3
    Complete Time: 6/14/2010 6:24:22 PM
    
    Press any key to continue . . .
    

    SyncDB 서버 데이터베이스의 Products 테이블에 있는 3개의 레코드가 Express 클라이언트에 다운로드됩니다.

  18. Enter 키를 눌러 명령 프롬프트 창을 닫습니다.

  19. SQL Server Management Studio에서 .\SQLEXPRESS 노드를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 클릭하여 쿼리 창을 엽니다.

  20. 다음 SQL 명령을 입력하고 F5 키를 눌러 실행하여 레코드가 실제로 Express 클라이언트에 다운로드되었는지 확인합니다.

    select * from products
    
  21. SQL Server Management Studio에서 (로컬) SQL Server, 데이터베이스, SyncDB테이블을 차례로 확장합니다.

  22. dbo.Products를 마우스 오른쪽 단추로 클릭하고 상위 200개의 행 편집을 클릭합니다.

  23. 끝에 ID4이고, 이름Wireless Mouse이고, ListPrice45인 레코드를 추가합니다. 마지막 값을 입력한 후 Tab 키를 눌러 레코드가 저장되었는지 확인합니다.

  24. 이제 Visual Studio에서 Ctrl+F5를 눌러 클라이언트 프로그램을 다시 실행합니다. 출력은 다음과 같은 형태가 됩니다.

    Start Time: 6/14/2010 6:32:44 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 1
    Complete Time: 6/14/2010 6:32:47 PM
    
    Press any key to continue . . .
    

    서버에 추가한 레코드 한 개가 이제 클라이언트에 다운로드되어야 합니다. 다음 단계를 사용하여 이를 확인할 수 있습니다.

  25. SQL Server Management Studio에서 .\SQLEXPRESS 노드를 선택합니다.

  26. 도구 모음에서 새 쿼리를 클릭합니다.

  27. 다음 SQL 명령을 입력하고 F5 키를 눌러 실행하여 레코드가 실제로 Express 클라이언트에 다운로드되었는지 확인합니다.

    select * from products
    
  28. 서버/클라이언트에서 레코드를 추가/업데이트/삭제하는 작업을 수행해 봄으로써 Sync Framework 기술에 익숙해질 수 있습니다. 예를 들어 서버에서 레코드를 삭제하는 경우 다음에 클라이언트를 서버와 동기화할 때 클라이언트 데이터베이스의 해당 레코드가 삭제되어야 합니다.

  29. 자습서에서 이 연습 다음에 나오는 연습을 수행하려는 경우 Visual StudioSQL Server Management Studio를 열어 둡니다.

전체 코드 예제

using System;
using System.Data;
using System.Data.SqlClient;

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;

namespace ExecuteExpressSync
{
    class Program
    {
        static void Main(string[] args)
        {
            // create connection to the SQL Express database
            SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");

            // create connection to the server database
            SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

            // create the sync orhcestrator
            SyncOrchestrator syncOrchestrator = new SyncOrchestrator();

            // set local provider of orchestrator to a sync provider associated with the 
            // ProductsScope in the SyncExpressDB express client database
            syncOrchestrator.LocalProvider = new SqlSyncProvider("ProductsScope", clientConn);

            // set the remote provider of orchestrator to a server sync provider associated with
            // the ProductsScope in the SyncDB server database
            syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);

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

            // subscribe for errors that occur when applying changes to the client
            ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);

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

            // print statistics
            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);
        }

        static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
        {
            // display conflict type
            Console.WriteLine(e.Conflict.Type);

            // display error message 
            Console.WriteLine(e.Error);
        }
    }
}

참고 항목

개념

방법: 데이터베이스 동기화 구성 및 실행(SQL Server)