Desenvolvimento - Mobile

Sincronização de Dados no .NET Framework 3.5

Veja como criar um projeto de sincronização de dados entre o SQL Server 2005 no servidor e um banco de dados local na máquina do cliente, podendo ser um desktop, um telefone celular, um Pocket PC.

por Renato Haddad



Tecnologias

.Net Framework 3.5, Windows Forms, .Sync

Sumário

Veja como criar um projeto de sincronização de dados entre o SQL Server 2005 no servidor e um banco de dados local na máquina do cliente, podendo ser um desktop, um telefone celular, um Pocket PC.

Introdução

Sincronizar dados entre diferentes fontes sempre foi um problema para qualquer tipo de aplicação, seja uma simples transferência de fotos da máquina digital para o desktop ou ainda de um pen-drive para o servidor. Eu estou falando de aplicações, não de abrir o Windows Explorer e copiar e colar os arquivos. Já no mundo real e corporativo, o que mais tenho visto são aplicações de transferências de dados entre base de dados. Algumas aplicações onde é preciso e condicional o uso de Aplicações Ocasionalmente Desconectadas – OCD – torna-se obrigatório adotar uma arquitetura que permita trabalhar desconectado do servidor. E, quando a conexão for restabelecida, a sincronização é efetuada. Este é o cenário e o foco deste artigo.

Cenário

Um exemplo bem clássico do uso de aplicações desconectadas que precisam ser sincronizadas com o servidor é de força de vendas, onde os vendedores anotam os pedidos dos clientes em um dispositivo móvel, normalmente um smartphone, onde contém uma forma de armazenamento local, seja um banco de dados, um arquivo XML ou TXT. Quando o mesmo tiver uma conexão com a rede, é disparada a sincronização.

Exatamente neste ponto, a sincronização, é que vou abordar como está absurdamente simples de se fazer com o Visual Studio .NET 2008 com o Service Pack 1 (SP1). Note que é obrigatório o uso do SP1 porque o template de SYNC só está disponível nele.

Responda esta pergunta: Você já teve que fazer um programa para sincronizar dados entre um dispositivo móvel ou uma aplicação desktop com o servidor? Se não, então nunca passou por este trauma. Se sim, sabe muito bem o que estou falando, pois quando falamos que a sincronização é simples, basta copiar e colar os dados da origem para o destino, isto não é verdade. O processo envolve uma série de implicações, por exemplo, consultar se o item existe, qual a regra de negócio a ser aplicada, se o item já foi atualizado, enfim, nada que algumas linhas de programação não resolvam.

Sincronização no VS.NET 2008 SP1

Até parece piada, mas o slogan “seus problemas acabaram” parece ter se tornado realidade. Vocês verão que a quantidade de código a ser criada são praticamente duas linhas, isto mesmo, duas linhas de código para disparar o processo de sincronização. Isto porque obviamente é o framework que fará o trabalho pesado nos bastidores. Então, vamos colocar a mão na massa e criar uma aplicação WinForms que irá criar um banco de dados localmente e quando quisermos sincronizar com o servidor, terá um botão para disparar o código.

Projeto

Abra o Visual Studio .Net 2008 com SP1, e crie um novo projeto do tipo Windows Forms Application chamado SincronizaMSDN na pasta C:\Projetos (ver Figura 1). A linguagem que vou utilizar é o C# mas fique à vontade para usar o VB.NET, é só mudar a sintaxe.

Figura 1 – Novo Projeto

Com o projeto criado, é exibido o Form1, deixe-o aí, não vamos mexer nele por enquanto. No Solution Explorer, dê um clique com o botão direito e selecione Add New Item.  Na janela aberta (ver Figura 2), selecione a categoria Data (Dados), em Templates use Local Database Cache e no nome do arquivo digite BancoLocal.sync. Observe que a extensão do arquivo é SYNC (syncronization), ou seja, aqui é o grande pulo do gato que o framework vai se encarregar de montar a estrutura de sincronização.

Figura 2 – Adicionar Local Database Cache

Clique no botão Add para adicionar o arquivo. Em seguida é aberta uma janela para configurar os dados, conforme a Figura 3.

Figura 3 – Configuração

Aqui você tem várias opções para selecionar o servidor. Clique no botão New e aponte para o respectivo servidor, conforme Figura 4. No meu caso usei o SQL Server local e o banco de dados Northwind. Caso queira trocar o Provider clique no botão Change.

 

Figura 4 – Servidor a ser usado

Uma vez definida a conexão, clique no botão OK. Note na Figura 5 que automaticamente a janela Configure Data Synchronization preenche os campos Server Connection com a origem do banco de dados no servidor e o Client Connection que será o banco de dados local. Neste ponto é importante destacar que a extensão do arquivo é SDF. Portanto, esta extensão refere-se ao SQL Compact Edition (o antigo SQL Server CE - http://www.microsoft.com/Sqlserver/2005/en/us/compact-downloads.aspx ), que é gratuito e, acredite sim, pode e deve ser usado para qualquer finalidade de armazenamento de dados. Quero dizer que o SQL Compact Edition está fantástico, você pode usá-lo tanto em desktop, num servidor, num smartphone, num Pocket PC, onde quiser.

Figura 5 – Configuração do Server e do Client

Nesta janela da Figura 6 clique no botão Advanced para exibir algumas opções onde você pode definir se a sincronização será realizada com uma simples transação, onde que os componentes de sincronização serão criados (Cliente and Server) e os nomes dos projetos no Server e no Client. Não altere nenhuma opção, deixe-as como estão.

Figura 6 – Opções Avançadas

O próximo passo é selecionar a tabela que usaremos para sincronizar os dados. Para isto, clique no botão Add e na janela aberta (conforme Figura 7), em Tables serão exibidas todas as tabelas do banco de dados Northwind que está no servidor. É exatamente nesta hora que você aponta quais tabelas serão copiadas no local para futura sincronização. No exemplo, selecione a tabela Customers. Observe que a opção Data to download já indica que seja feito o download na primeira sincronização (New and incremental changes after first synchronization). Em seguida é preciso definir as regras do Update, insert e delete. Para o Update o default é LastEditDate (new), o que indica que o que vale é o registro que for alterado por último. Já para o insert valerá a data de criação do registro. Para exclusão os registros excluídos serão movidos para a tabela Customers_Tombstone (new), mas caso queira mudar o nome basta clicar no botão Edit e digitar o novo nome da tabela.

Figura 7 – Lista de tabelas

Clique no botão OK para efetivar, e logo em seguida a tabela Customers irá aparecer na lista de Cached Tables (tabelas que serão editadas offline), conforme a Figura 8.

Figura 8 – Tabela a ser usada

Clique no botão OK. Na janela aberta Generate SQL Scripts (conforme Figura 9), deixe selecionadas os dois checkboxes indicando que as atualizações no servidor serão incrementais e o script do SQL será salvo para futuro uso. Isto é fantástico pois todo o trabalho de escrever T-SQL será feito pelo assistente.

 

Figura 9 – Geração dos scripts

Clique no botão OK. Durante o processo o assistente já fará todo o trabalho duro nos bastidores, você verá uma janela indicando isto (ver Figura 10).

Figura 10 – Geração automática dos scripts SQL

Em seguida, veja na Figura 11 que o assistente abre uma janela para você selecionar a tabela Customers e definir o nome do DataSet a ser gerado.

Figura 11 – Definição do Dataset

Clique no botão Finish. Vamos ver algumas coisas interessantes criadas no projeto. Veja na Figura 12 que nas referências temos três novas classes: Microsoft.Synchronization.Data, Microsoft.Synchronization.Data.Server e Microsoft.Synchronization.Data.SqlServerCe. Existem dois novos folders (SQLScripts e SQLUndoScripts) contendo absolutamente todos os scripts T-SQL necessários para a execução da transação. Temos ainda o arquivo BancoLocal.sync que é a classe com toda a estrutura para sincronização. Note que foi gerado o arquivo Northwind.sdf, o qual você pode dar um duplo clique e abri-lo no Server Explorer, e por fim, o NorthwindDataSet que é o dataset gerado. Ou seja, tudo isto foi gerado pelo assistente, coisas que tínhamos que fazer na mão no passado (não muito distante).

Figura 12 – Itens criados pelo gerador

Definido a direção da sincronização

Agora que já temos praticamente tudo o que precisamos para execução, resta-nos definir alguns detalhes. Para isto, abra o arquivo BancoLocal.Designer.cs e localize o seguinte código:

partial void OnInitialized();

Substitua por este bloco de código, o qual indica que a tabela Customers será sincronizada na forma bidirecional, ou seja, a se alterar no cliente ou no servidor, quando for sincronizado, ambos os dados deverão ser atualizados.  Salve o arquivo e feche-o.

void OnInitialized()

{

    this.Customers.SyncDirection = Microsoft.Synchronization.Data.SyncDirection.Bidirectional;

}

A direção da sincronização é importante. Existem outras três opções, sendo:

DownloadOnly – só faz o download do servidor;

Snapshot – é uma foto dos dados no servidor sem fazer download ou upload;

UploadOnly – só faz upload para o servidor.

Formulário de dados

Agora precisamos montar o formulário para exibir os dados. Abra o Form1 e selecione o menu Data / Show Data Sources. Na janela aberta é exibida a tabela Customers do arquivo SDF, que é o local que foi criado no Dataset. Clique e arraste a tabela Customers para dentro do Form1. Veja na Figura 13 que Já será criado o DataGridView com todas as colunas, assim como a barra de controle de dados. Tudo isto é automático, basta arrastar a tabela. Se precisar redimensione o controle de acordo com o tamanho do formulário.

Figura 13 – Estrutura do formulário

Para sincronizar os dados, adicione um botão com o texto Sincronizar. E agora, qual será o código para disparar a sincronização? Lembra-se no início do artigo quando eu disse que tudo ficou absurdamente simples e fácil? Então, onde está o código, onde pesquisar? A resposta é simples: no Solution Explorer, dê um duplo clique no arquivo BancoLocal.sync para abrir a janela do Configure Data Synchronization. Conforme a Figura 14, clique no link Show Code Example o qual irá abrir uma janela com o código de exemplo. Em seguida, clique no botão Copy code to the Clipboard para copiar o código para a área de transferência.

Figura 14 – Cópia do código automático

Uma vez copiado, feche esta janela e volte para o Form1. Dê um duplo clique no botão Sincronizar para criar o evento, e simplesmente dê um CTRL + V para colar o código de exemplo, conforme a Listagem 1:

Listagem 1 – Código para sincronização

private void button1_Click(object sender, EventArgs e)

{

    // Call SyncAgent.Synchronize() to initiate the synchronization process.

    // Synchronization only updates the local database, not your project"s data source.

    BancoLocalSyncAgent syncAgent = new BancoLocalSyncAgent();

    Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();

}

Pronto, tudo o que você precisa está aqui, são DUAS linhas de código apenas, acredite. O código anterior vai enviar os dados alterados ou incluídos para o servidor, onde são feitas as devidas atualizações e, em seguida, os dados são baixados para o banco local para atualizar algum dado alterado no servidor. Neste momento o usuário não sabe o status, então, adicione algumas linhas a seguir para deixar o código mais interativo. O form_load é para recarregar o formulário após a sincronização e caixa de mensagem é para informar a quantidade de dados transferidos.

private void button1_Click(object sender, EventArgs e)

{

    // Call SyncAgent.Synchronize() to initiate the synchronization process.

    // Synchronization only updates the local database, not your project"s data source.

    BancoLocalSyncAgent syncAgent = new BancoLocalSyncAgent();

    Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();

    // chama o Form_Load para exibir os dados atualizados

    Form1_Load(null, null);

    // exibe o resultado da sincronização

    MessageBox.Show(string.Format("Qtde Downloaded: {0} - Qtde Uploaded: {1}",

                    syncStats.TotalChangesDownloaded.ToString(),

                    syncStats.TotalChangesUploaded.ToString()));

}

Execução

Com o código pronto, pressione a tecla F5 para executar a aplicação. Selecione alguns registros na aplicação e edite-os. É importante ressaltar que você deverá salva-los antes de submeter a sincronização, e para isto basta clicar no ícone do disco na barra de ferramentas (conforme a Figura 15). Para efeito de comparação, abra o Server Explorer e a tabela Customers para verificar que os dados serão atualizados somente após a sincronização.

Figura 15 – Execução do formulário

Ao mesmo tempo altere outros dados no servidor e salve-os. Agora é chegada a grande hora do teste final. Clique no botão sincronizar e veja que os dados estarão sincronizados no servidor e no banco local. O resultado está exibido na caixa de mensagem, conforme a Figura 16.

Figura 16 – Resultado da sincronização

Conclusão

Neste artigo você percebeu que a sincronização de dados se tornou muito simples de se fazer, agregando muito valor a qualquer tipo de aplicação que necessite manipular dados offline, ou seja, aplicações ocasionalmente desconectadas. Portanto, use e abuse dos recursos de sincronização do VS.NET 2008 SP1.

Por: Renato Haddad (rehaddad@msn.com  – www.renatohaddad.com ) é MVP, MCPD e MCTS, palestrante em eventos da Microsoft em diversos países, ministra treinamentos focados em produtividade com o VS.NET 2008, ASP.NET 3.5 e Windows Mobile. Visite o blog http://weblogs.asp.net/renatohaddad

Renato Haddad

Renato Haddad - MVP, MCPD e MCTS, palestrante em eventos da Microsoft em diversos países, ministra treinamentos focados em produtividade com o VS.NET 2008, ASP.NET 3.5, Reporting Services e Windows Mobile.