Acessos: 24890
O DataSnap é baseado na tecnologia que permite que os conjuntos de dados sejam empacotados e enviados através da rede como parâmetros nas chamadas a métodos remotos (Remote Procedure Call - RPC). Ele inclui tecnologias que permitem converter um TDataSet em dados Variant ou XML do lado do servidor. No lado do cliente esses dados são transformados novamente em TDataSet1 e exibidos ao usuário em um TDBGrid (por exemplo), com a ajuda dos componentes TClientDataSet ou TInetXPageProducer.
Para construir o seu primeiro Servidor DataSnap (doravante chamado de SDS) você começa com uma aplicação nova vazia (File > New > Application2). Enquanto o formulário principal da aplicação estiver sendo exibido significa que o SDS estará ativo, em outras palavras, o loop de mensagens da aplicação vai manter o SDS vivo. Configure um título para o formulário principal de forma a identificar o SDS. Além disso eu costumo incluir neste formulário um TLabel com uma fonte grande e legível e configuro sua propriedade Caption com um valor sugestivo para o nome do SDS, por exemplo, "Meu primeiro servidor DataSnap".
Para transformar uma aplicação regular em um servidor de aplicação (middleware database server), você precisa adicionar um Remote DataModule (RDM) nela. Este DataModule especial pode ser encontrado na aba3 "Multitier" do Object Repository do Delphi, logo, acesse File > New > Other e vá direto à aba Multitier, a qual mostra vários Wizards CORBA4, um Remote DataModule e um Transitional DataModule4. O último pode ser usado com o MTS (Microsoft Transaction Server) antes do Windows 2000 ou COM+ no Windows 2000 ou posterior e não será coberto aqui. É o RDM "normal" que você precisa selecionar para criar seu primeiro SDS simples. Ao selecionar o ícone do RDM e clicar no botão OK, o assistente "New Remote DataModule Object"5 será iniciado.
O Remote DataModule6
O resultado da execução do assistente é um RDM que parece muito com um TDataModule regular. Visualmente não existem diferenças, e se você planeja usar o BDE, então você pode começar considerando-o como um TDataModule qualquer, soltando nele um componente TSession sem esquecer de configurar a propriedade AutoSessionName como true. Lembre-se de que fazer isso é imprescindível caso você esteja usando o modelo de thread Apartment7.
Basicamente isso é tudo que precisa ser feito para criar o seu primeiro SDS. A única coisa que resta ser feita é salvar o projeto. Salvei o formulário principal no arquivo "ServerMainForm.pas", o RDM foi salvo no arquivo "RDataMod.pas"8, e salvei o projeto do SDS no arquivo "SimpleDataSnapServer.dpr". Após ter salvo o projeto, precisamos compilá-lo e executá-lo. Ao executar o SDS -- o qual mostrará apenas o formulário principal, claro -- ele será registrado9 (no registro do Windows), assim qualquer cliente DataSnap poderá encontrá-lo e então conectar-se a ele. Mesmo que você mova o SDS para outro diretório (na mesma máquina), você precisará apenas executá-lo novamente para que ele seja re-registrado na nova localização. Esta é uma forma muito conveniente de gerenciar servidores DataSnap.
Antes de mais nada, seu cliente DataSnap precisa fazer uma conexão com o SDS. Esta conexão pode ser feita usando vários protocolos distintos, como (D)COM, TCP/IP (sockets) e HTTP e os componentes que implementam estes protocolos de conexão são, respectivamente, TDCOMConnection, TSocketConnection, TWebConnection e TCorbaConnection10 na aba DataSnap e o TSoapConnection na aba Web Services. Para este primeiro cliente DataSnap simples usaremos o componente TDCOMConnection, logo, inclua este componente no seu formulário principal.
Perceba que o método LoadFromFile não precisa de um segundo argumento; ele é suficientemente esperto para determinar se está lendo um arquivo binário ou um XML11.
É excelente ser capaz de conectar-se a um conjunto de dados remoto ou carregar um conjunto de dados local e depois salvá-lo no disco de novo, mas como se aplicam as atualizações12 ao banco de dados de fato (remoto)? Isso pode ser feito usando-se o método ApplyUpdates do TClientDataSet. Inclua mais um TButton no formulário principal, configure seu nome como "ButtonApplyUpdates" e seu Caption como "Aplicar Alterações". Tal como o botão "Salvar", este botão deve apenas aplicar alterações caso haja alterações a serem aplicadas. O manipulador do evento OnClick deste botão segue:
Felizmente o Delphi possui uma caixa de diálogo muito útil especialmente desenvolvida para este propósito. Sempre que você precisar realizar alguma conciliação de erros13, você deve considerar a adição desta caixa de diálogo ao seu Cliente DataSnap (ou escrever uma você mesmo, mas algo sempre precisa ser feito a respeito destes erros). Para usar a caixa de diálogo disponibilizada pelo Delphi, vá em File > New > Other, acesse a aba (ou item) "Dialogs"14 do Object Repository e selecione o ícone "Reconcile Error Dialog". Uma vez que você tenha selecionado este ícone e clicado OK, uma nova unit será adicionada ao projeto do Cliente DataSnap. Esta unit contém a definição e a implementação da caixa de diálogo "Update Error", que pode ser usada para resolver erros decorrentes de conflitos nas operações de banco de dados.
Para mais informações leia Dr. Bob Eaxamines #63 em "Tecnologias de acesso a dados no C++ Builder" e #58 "Desenvolvimento de Aplicações de Bancos de Dados", bem como meus artigos15 do BorCon 2004 em "Técnicas de acesso a dados com ClientDataSets" e do BorCon 2003 em "Indrodução ao ClientDataSet e ao dbExpress".
5 Este nome pode variar
6 Esta seção está focada no BDE, que era a tecnologia nativa de conexão disponível no Delphi na época em que este artigo foi escrito. Obviamente você não precisa (e nem deve) usar mais o BDE. Resumidamente, ignore as referências ao BDE e inclua no RDM componentes correlatos disponíveis no suíte de componentes de conexão de sua preferência (FireDAC, UniDAC, ZeosLib, DBX, etc.)
7 Ao criar o RDM, o modelo de thread padrão é o Apartment, logo, você precisará configurar a propriedade AutoSessionName como true neste exemplo, caso esteja usando o BDE
8 Um arquivo adicional de extensão .tlb pode ter sido criado pelo assistente "New Remote DataModule Object". Caso haja necessidade de salvar este arquivo, nomeie-o com o mesmo nome do RDM, ou seja, RDataMod.tlb.
9 A partir do Delphi 2007 o registro automático foi descontinuado devido a presença maciça do UAC nos Windows, por isso, se você tentar rodar este programa ele não será registrado automaticamente. Se este for seu caso, basta executá-lo com a linha de comando /RegServer. Para desregistrá-lo, use a linha de comando /UnRegServer. O registro e o desregistro precisam ser feitos executando o SDS como administrador
10 Este componente pode não existir na sua versão de Delphi
11 O arquivo XML que pode ser carregado pelo TClientDataSet tem uma estrutura específca, no entanto, qualquer XML pode ser carregado por um TClientDataSet após sofrer uma transformação XML, ou seja, uma conversão que transforma uma estrutura XML qualquer numa estrutura XML que o TClientDataSet é capaz de entender (DATAPACKET). Para realizar a conversão, utilize o XML Mapper, disponível no diretório bin do Delphi. O XML Mapper vai gerar um arquivo de transformação XML (XSLT) com o qual, em tempo de execução, um arquivo XML "padrão" pode ser convertido em um XML DataPacket
12 Quero ressaltar novamente que a palavra "atualizar" aqui significa qualquer operação que altere o banco de dados. No caso, uma inserção, uma exclusão e uma alteração propriamente dita, todas estas operações alteram o banco de dados, inserindo, excluindo ou alterando registros
13 "Conciliar erros" ou "Reconciliar erros" vem do inglês "Reconcile Error" e pode ser interpretado como uma forma de resolver problemas (erros) nos dados quando o DataSnap não consegue determinar o que deve ser feito. A responsabilidade da decisão do que deve ser feito com dados conflitantes ou errados é sempre passada à aplicação ou ao usuário, o qual tem o poder de decidir o que deve ser feito
14 Nos Delphis mais recentes, o ítem do Object Repository é "Delphi Files" e o nome do ícone a ser selecionado é "VCL Reconcile Error Dialog"
15 Os links para estes artigos não existem mais. Mantive-os aqui apenas para registro histórico. Caso eles lhe interessem, contate Bob Swart diretamente para pedir uma cópia, caso ele ainda as possua.