Acesso a banco de dados em aplicativos SmartClient Por Mauro Sant’Anna ([email protected]). Mauro é um “MSDN Regional Director”, consultor e instrutor da MAS Informática (www.mas.com.br), tendo ministrado treinamentos na arquitetura .NET desde outubro de 2000. Um aplicativo SmartClient une a boa experiência com o usuário dos aplicativos Windows com a facilidade de instalação e atualização dos aplicativos Web. Caso você não conheça este tipo de tecnologia, sugiro a leitura dos seguintes artigos: WinControls fora e dentro do navegador Deploy WinForms on the Web Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients Smart Client Applications Technology Map Uma dúvida comum que surge no uso deste tipo de aplicativo é “Como é feito o acesso a banco de dados?” A resposta é “através de WebServices”. Este artigo sai da teoria e mostra um exemplo simples de acesso e atualização de banco de dados através de WebServices em conjunto com um aplicativo “SmartClient”. Criando o WebService Iremos efetuar consulta e atualização em banco de dados SQL Server na tabela Products presente na base Northwind, um exemplo que vem com o próprio servidor de banco de dados. Este WebService terá dois métodos: 1. Consulta a base de produtos, dado o início do nome do produto usando uma cláusula LIKE no comando SQL e retornando um DataSet tipado. 2. Atualização da base de produtos ao receber um DataSet tipado contendo os dados a serem atualizados. É comum que um WebService deste tipo contenha mais de um método de consulta, aceitando diferentes parâmetros. No nosso caso, por exemplo, poderíamos ter métodos adicionais para retornar linhas dado código do produto ou sua categoria. É muito importante, contudo, que o conjunto de resultado seja sempre pequeno, já que ele será copiado integralmente para o cliente. Não devemos, absolutamente, manter um cursor aberto em um WebService. Para criar o WebService, abra o Visual Studio .NET e peça a criação de um novo projeto do tipo “ASP.NET WebService” com a linguagem C#: Dê o nome ao projeto de “WS_Northwind”. Adicione ao projeto um componente do tipo “SqlDataAdatper” que causará a chamada de um assistente: Clique “Next”: Clique em New Connection: Entre os dados da conexão. Neste exemplo estamos trabalhando com “SQL Server Integrated Security” e com usuário “sa” e senha em branco. Isto é terrivelmente inseguro e jamais deve ser feito em um site em produção. Clique em Ok: Clique Next: Peça para usar um comando SQL: Entre o comando “SELECT * FROM PRODUCTS WHERE PRODUCTNAME LIKE @PRODUCTNAME” e clique em “Finish”. Selecione o menu “Data | Generate Dataset...”: Entre com o nome “DSProducts” para o novo DataSet e clique em “OK”. Estamos criando um DataSet tipado, que contém definições para a tabela “Products” e suas colunas, de forma a facilitar a manipulação dos dados. Peça agora para visualizar o código do WebService clicando F7 e adicione a seguinte linha antes de “public class Service1” de forma a dar um namespace ao WebService: [WebService(Namespace="http://picaplan.com")] Digite os dois métodos do WebService: [WebMethod] public DSProducts FillProductsByName(string ProductName) { sqlSelectCommand1.Parameters["@ProductName"].Value = ProductName + "%"; DSProducts DS = new DSProducts(); sqlDataAdapter1.Fill(DS); return DS; } [WebMethod] public void UpdateProducts(DSProducts DS) { sqlDataAdapter1.Update(DS); } O primeiro método aceita o nome do produto, pesquisa no banco de dados e retorna um DataSet tipado contendo as linhas que satisfazem o pedido.. O segundo método aceita o mesmo DataSet tipado contendo alterações a serem feitas na base. Este DataSet pode conter inserções, alterações e exclusões. Desenvolvendo o cliente Iremos agora desenvolver o aplicativo “SmartClient” que chamará o WebService. Crie um novo aplicativo do tipo “Windows Application”: Dê o nome de “SmartClientWebService” e clique “Ok”. Adicione uma “Web Reference” ao projeto selecionando o menu “Project | Add Web Reference”: Entre a URL do seu Web Service (“http://localhost/WS_Northwind/Service1.asmx”, no caso”) e peça “Add Reference”. Adicione um Label, um TextBox, três Button e um DataGrid ao formulário, conforme mostrado a seguir: Acrescente código para tratar os eventos Click de cada um dos botões: // Declare an object to hold a reference to the DataSet localhost.DSProducts DS; // Submit Query Button private void button1_Click(object sender, System.EventArgs e) { localhost.Service1 WS = new localhost.Service1(); DS = WS.FillProductsByName(textBox1.Text); dataGrid1.DataSource = DS.Products; } // Submit changes Button private void button2_Click(object sender, System.EventArgs e) { if (DS.HasChanges()) { DataSet Changes = DS.GetChanges(); localhost.Service1 WS = new localhost.Service1(); DS.AcceptChanges(); WS.UpdateProducts((localhost.DSProducts) Changes); } } // Ignore changes Button private void button3_Click(object sender, System.EventArgs e) { DS.RejectChanges(); } Veja o que cada método faz: Na consulta estamos obtendo um DataSet tipado correspondente a uma consulta no banco de dados; Na atualização estamos primeiro perguntando se houveram modificações. Em caso afirmativo, estamos extraindo as modificações em um novo DataSet e a seguir submetendo este DataSet que contém apenas as modificações ao WebService para atualização. Depois disto chamamos AcceptChanges para confirmar as alterações efetuadas; Para ignorar as modificações feitas no DataSet do cliente chamamos RejectChanges. O aplicativo acima deve funcionar perfeitamente ao ser executado localmente, a partir do diretório no qual foi compilado: Alterando a URL do WebService Observe que a referência colocada no programa sempre se refere ao site “localhost”. Em produção teríamos que alterar a propriedade Url do WebService para o site real de produção. Uma das maneiras de fazer isto é com o seguinte fragmento de código: localhost.Service1 WS = new localhost.Service1(); WS.Url = “http://Myserver.com.br/Ws/Service1.asmx”; Outra maneira é alterar a propriedade do WebService de “URL Behaviour” para “Dynamic”: Neste caso, a URL pode ser alterada editando o arquivo “SmartClientWebService.exe.config”, criado automaticamente no mesmo diretório do executável: Distribuição pela Web Vejamos agora como distribuir o mesmo aplicativo pela Web. Inicialmente, copie o executável para o diretório do servidor Web (normalmente “c:\Inetpub\wwwroot”). A seguir, use um editor de texto qualquer como o Notepad e crie uma página Web chamada “SmartApp.htm” com o seguinte conteúdo (note o link com a tag “href”): <html> <head><title>Test Smart Client App</title></head> <body> <h1>Smart Client Application</h1> <a href="SmartClientWebService.exe">SmartApp</a> </body> Abra a página no navegador através do servidor Web na URL http://localhost/SmartApp.htm: Ao clicar no link, o aplicativo é automaticamente baixado via HTTP, copiado paa um “cache” no cliente e executado, como mostrado a seguir: Conclusão Para acessar bancos de dados em aplicativos SmartClient basta criar WebServices com métodos de consulta e atualização.