Passo a passo: executando a sincronização para o escopo filtrado [SQL Express]
Neste passo a passo, você criará um aplicativo de console que sincroniza o banco de dados SyncExpressDB com o banco de dados SyncDB. Para obter mais detalhes técnicos sobre o provisionamento de servidores/clientes e a execução do processo de sincronização, consulte Como configurar e executar a sincronização de bancos de dados (SQL Server).
Para executar a sincronização
No Gerenciador de Soluções, clique com o botão direito do mouse em Solução ‘SyncSQLServerAndSQLExpress’, aponte para Adicionar e clique em Novo Projeto.
Selecione Visual C# em Tipos de Projeto e selecione Aplicativo do Console em Modelos.
Digite ExecuteExpressFilteredSync para nome do projeto.
Clique em OK para fechar a caixa de diálogo Novo Projeto.
Na janela Gerenciador de Soluções, clique com o botão direito do mouse em ExecuteExpressFilteredSync e clique em Adicionar Referência.
Selecione Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer na guia .NET e clique em OK para fechar a caixa de diálogo Adicionar Referência.
Adicione as instruções using a seguir ao início do arquivo Program.cs após as instruções using existentes.
using System.Data; using System.Data.SqlClient; using Microsoft.Synchronization; using Microsoft.Synchronization.Data; using Microsoft.Synchronization.Data.SqlServer;
Adicione a instrução a seguir ao método Main para criar uma conexão SQL com o banco de dados expresso.
// connect to the SQL Express database SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");
Adicione a instrução a seguir ao método Main para criar uma conexão SQL com o banco de dados servidor.
// connect to the server database SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
Importante
Na instrução anterior, substitua o nome do servidor pelo nome da instância do seu servidor, caso não esteja usando a instância padrão. Por exemplo: se o nome de sua instância do SQL Server for MYSQLINSTANCE, substitua (local) por .\MYSQLINSTANCE.
Adicione o código a seguir ao método Main para criar um orquestrador de sincronização, que inicia e contra sessões de sincronização. O orquestrador de sincronização contém dois provedores de sincronização que participarão de uma sessão de sincronização. Em nosso cenário, você precisará usar um objeto de provedor para o banco de dados servidor e um objeto de provedor para o banco de dados cliente expresso. Etapas de alto nível para criar um orquestrador para este cenário:
Crie uma instância da classe SyncOrchestrator. A classe SyncOrchestrator inicia e controla sessões de sincronização.
Defina o provedor local do objeto do orquestrador de sincronização para um objeto SqlSyncProvider associado ao banco de dados cliente SyncExpressDB. A classe SqlSyncProvider encapsula um provedor de sincronização para SQL Express que se comunica com o cliente e protege o orquestrador de sincronização contra a implementação específica do banco de dados cliente.
Defina o provedor remoto do orquestrador de sincronização para um objeto SqlSyncProvider associado ao banco de dados servidor SyncDB. A classe SqlSyncProvider representa um provedor de sincronização que se comunica com um banco de dados SQL Server e protege outros componentes do Sync Framework contra a implementação específica do banco de dados.
Defina a direção da sincronização do objeto do orquestrador de sincronização como UploadAndDownload para que o cliente possa baixar/carregar as alterações de/para o servidor.
// create a sync orchestration object SyncOrchestrator syncOrchestrator = new SyncOrchestrator(); // set the local provider of sync orchestrator to a sync provider that is // associated with the OrdersScope-NC scope in the SyncExpressDB database syncOrchestrator.LocalProvider = new SqlSyncProvider("OrdersScope-NC", clientConn); // set the remote provider of sync orchestrator to a server sync provider that is // associated with the OrdersScope-NC scope in the SyncDB database syncOrchestrator.RemoteProvider = new SqlSyncProvider("OrdersScope-NC", serverConn); // set the direction to Upload and Download syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
Adicione o código a seguir para assinar eventuais erros que ocorram durante a aplicação de alterações feitas no cliente. O evento ApplyChangeFailed será gerado quando uma linha não puder ser aplicada a um cliente. Você definirá o manipulador do evento de erro mais tarde neste passo a passo.
// subscribe for errors that occur when applying changes to the client ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
Adicione a instrução a seguir ao método Main para executar a sincronização entre o SQL Server e o SQL Express. Esse código invoca o método Synchronize()()()() no objeto SyncOrchestrator para iniciar o processo de sincronização entre o banco de dados servidor SyncDB e o banco de dados expresso SyncExpressDB.
// starts the synchornization session SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
Adicione as instruções a seguir ao método Main para exibir as estatísticas da sessão de sincronização. O objeto SyncOperationStatistics retornado por esse método contém estatísticas sobre a sessão de sincronização que foi executada.
// prints statistics from the sync session 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);
Adicione o método do manipulador de eventos a seguir à classe Program depois do método Main para manipular o evento ApplyChangeFailed. O parâmetro DbApplyChangeFailedEventArgs fornece informações sobre o erro ou o conflito que provocou a falha. Em um manipulador do evento, você pode responder ao evento de várias maneiras, inclusive especificando se o provedor de sincronização deve tentar aplicar a linha novamente. A propriedade Error do objeto contém metadados sobre todas as exceções ocorridas durante a sincronização. O código de exemplo a seguir exibe esse erro e o tipo de conflito (do tipo DbConflictType) ocorrido durante a sincronização.
static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e) { // display conflict type Console.WriteLine(e.Conflict.Type); // display error message Console.WriteLine(e.Error); }
No Gerenciador de Soluções, clique com o botão direito do mouse em ExecuteExpressFilteredSync e clique em Compilar.
No Gerenciador de Soluções, clique com o botão direito do mouse em ExecuteExpressFilteredSync novamente e clique em Definir como Projeto de Inicialização.
Aviso
Se você não executar esta etapa e pressionar Ctrl+F5 novamente, o aplicativo ProvisionFilteredScopeClient será reexecutado e você obterá uma mensagem de erro sobre o escopo que já existe no banco de dados cliente.
Pressione Ctrl+F5 para executar o programa. A saída deve ter esta aparência:
Start Time: 6/14/2010 6:24:19 PM Total Changes Uploaded: 0 Total Changes Downloaded: 2 Complete Time: 6/14/2010 6:24:22 PM Press any key to continue . . .
Os dois registros com a coluna OriginalState definida como ‘NC’ são baixados da tabela Orders no servidor SyncDB para o cliente expresso.
Pressione ENTER para fechar a janela do prompt de comando.
No SQL Server Management Studio, selecione .\SQLEXPRESS.
Clique em Nova Consulta na barra de ferramentas.
Digite e execute (pressionando F5) o comando SQL a seguir para confirmar se os registros foram realmente baixados no cliente expresso.
select * from Orders
Para familiarizar-se com a tecnologia Sync Framework, você pode adicionar/atualizar/excluir registros do servidor/cliente. Por exemplo, se você excluir um registro do servidor, o registro correspondente no banco de dados cliente deverá ser excluído na próxima sincronização do cliente com o servidor.
Exemplo de código completo
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
namespace ExecuteExpressFilteredSync
{
class Program
{
static void Main(string[] args)
{
// connect to the SQL Express database
SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");
// connect to the server database
SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
// create a sync orchestration object
SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
// set the local provider of sync orchestrator to a sync provider that is
// associated with the OrdersScope-NC scope in the SyncExpressDB database
syncOrchestrator.LocalProvider = new SqlSyncProvider("OrdersScope-NC", clientConn);
// set the remote provider of sync orchestrator to a server sync provider that is
// associated with the OrdersScope-NC scope in the SyncDB database
syncOrchestrator.RemoteProvider = new SqlSyncProvider("OrdersScope-NC", serverConn);
// set the direction 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);
// starts the synchornization session
SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
// prints statistics from the sync session
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);
}
}
}
Consulte também
Outros recursos
Como configurar e executar a sincronização de bancos de dados (SQL Server)