Acesso a banco de dados em aplicativos SmartClient

Propaganda
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.
Download