다음을 통해 공유


연습: 두 번째 클라이언트와의 동기화 실행

두 번째 Compact 데이터베이스 SyncCompactDB2SyncCompactDB2가 이미 SyncDB 데이터베이스와 동기화되어 있는 SyncCompactDB의 스냅숏이므로 이미 SyncDB 서버 데이터베이스와 동기화되어 있어야 합니다.

이 연습에서는 두 번째 Compact 클라이언트를 서버와 동기화하고, 서버에 새 레코드를 추가하고, 두 번째 Compact 클라이언트를 서버와 동기화하고, 첫 번째 Compact 클라이언트도 서버와 동기화하는 콘솔 응용 프로그램을 만듭니다. 서버/클라이언트 프로비전 및 동기화 프로세스 실행에 대한 보다 자세한 기술 정보는 방법: 데이터베이스 동기화 구성 및 실행(SQL Server)을 참조하십시오.

동기화를 실행하려면

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

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

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

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

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

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

  7. 앞의 두 단계를 반복하여 System.Data.SqlServerCe 어셈블리에 대한 참조를 추가합니다.

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

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

    //create a connection to the second compact database
    SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='C:\SyncSQLServerAndSQLCompact\SyncCompactDB2.sdf'");
    
  10. 다음 문을 Main 메서드에 추가하여 서버 데이터베이스에 대한 SQL 연결을 만듭니다.

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

    중요

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

  11. 다음 코드를 Main 메서드에 추가하여 동기화 세션을 시작 및 제어하는 동기화 조정자를 만듭니다. 동기화 조정자에는 동기화 세션에 참가할 두 개의 동기화 공급자가 포함되어 있습니다. 이 시나리오에서는 서버 데이터베이스에 대한 공급자 개체 하나와 두 번째 SQL Server Compact 클라이언트 데이터베이스에 대한 공급자 개체 하나를 사용해야 합니다. 이 시나리오에서 조정자를 만드는 대략적인 단계는 다음과 같습니다.

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

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

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

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

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

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

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

    //print sync 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);
    
  15. 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);
    }
    
  16. 솔루션 탐색기에서 ExecuteSecondCompactSync를 마우스 오른쪽 단추로 클릭하고 빌드를 선택합니다.

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

    경고

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

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

    Start Time: 6/14/2010 8:03:31 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 0
    Complete Time: 6/14/2010 8:03:34 PM
    
    Press any key to continue . . .
    

    클라이언트가 이미 서버와 동기화되어 있으므로 다운로드된 레코드가 없습니다.

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

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

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

  22. 끝에 ID5이고, 이름Wireless Keyboard이고, ListPrice30인 레코드를 추가합니다. Tab 키를 눌러 레코드가 저장되었는지 확인합니다.

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

    Start Time: 6/14/2010 8:06:21 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 1
    Complete Time: 6/14/2010 8:06:23 PM
    
    Press any key to continue . . .
    

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

  24. SQL Server Management Studio에서 **SQL Server Compact [My Computer\...\SyncCompactDB2]**를 선택합니다.

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

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

    select * from products
    
  27. 첫 번째 Compact 클라이언트가 아직 동기화되지 않았습니다. 확인하려면 다음을 수행합니다.

    1. 개체 탐색기 창에서 SyncCompactDB(끝에 2 없음)를 선택합니다.

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

    3. 다음 명령을 입력하고 실행합니다.

      select * from products
      

      아직은 서버에 추가된 마지막 레코드가 표시되지 않습니다. 두 번째 클라이언트가 동기화되었지만 첫 번째 클라이언트는 동기화되지 않았습니다.

  28. Visual Studio솔루션 탐색기에서 ExecuteCompactSync를 마우스 오른쪽 단추로 클릭한 다음 시작 프로젝트로 설정을 클릭합니다.

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

    Start Time: 6/14/2010 8:10:54 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 1
    Complete Time: 6/14/2010 8:10:56 PM
    
    Press any key to continue . . .
    

    서버에 추가한 레코드 한 개가 이제 첫 번째 클라이언트에 다운로드되어야 합니다. 다음 단계를 사용하여 이를 확인할 수 있습니다. SQL Server Management Studio에서 이전에 첫 번째 Compact 데이터베이스(SyncCompactDB)에 대해 실행한 선택 명령을 실행합니다.

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

  31. 매개 변수가 있는 범위와 관련된 선택적 연습을 수행하려는 경우 Visual StudioSQL Server Management Studio를 열어 둡니다.

전체 코드 예제

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

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

namespace ExecuteSecondCompactSync
{
    class Program
    {
        static void Main(string[] args)
        {
            //create a connection to the second compact database
            SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='C:\SyncSQLServerAndSQLCompact\SyncCompactDB2.sdf'");

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

            // create a sync orchestrator
            SyncOrchestrator syncOrchestrator = new SyncOrchestrator();

            // set the local provider to a CE sync provider associated with the
            // ProductsScope in the Sync Compact DB 2 database
            syncOrchestrator.LocalProvider = new SqlCeSyncProvider("ProductsScope", clientConn);

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

            // set the diretion 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();
        }

        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)