Professional Documents
Culture Documents
O objetivo deste artigo é desenvolver um sistema de cadastro de clientes acessível através de um WebService, o qual poderá ser utilizado por
outros sites que consumirem o WebService, possibilitando a inclusão, alteração, exclusão, consulta e autenticação de clientes pessoa física e
pessoa jurídica.
Nosso webservice deverá permitir o cadastro de pessoas física e jurídica, conforme diagrama de classes abaixo:
Conforme o Diagrama de Classes do nosso Projeto, vamos criar a seguinte Tabela em nosso Banco de Dados de Clientes. Utilizaremos o
Microsoft Access:
É importante lembrar que o fato de termos mapeado o nosso diagrama de classes em apenas uma tabela, é apenas uma decisão de projeto, e
teríamos pelo menos mais 2 formas possíveis de fazer este mapeamento, criando uma tabela para cada classe ou criando duas tabelas (pessoa
física e pessoa jurídica) e repetindo os atributos de pessoa em cada uma delas.
Agora é hora de criarmos os nossos arquivos de classes, responsáveis basicamente por acessar o nosso banco de dados de clientes e efetuar as
operações propostas pelo nosso projeto (inclusão, alteração, exclusão, consulta e autenticação de clientes). Para tanto, abra o seu Visual
Studio, crie um novo Projeto e adicione 3 arquivos de classes: clsPessoa, clsPessoaFis e clsPessoaJur:
A nossa classe clsPessoa, será abstrata, ou seja, ela não poderá ser instanciada diretamente. Vamos escrever o código para criação de nossos
atributos e métodos conforme o nosso diagrama de classes:
Note que até agora, criamos a nossa classe abstrata e os nossos atributos (propriedades). Uma classe é abstrata se ela possui ao menos um
método abstrato e tais métodos devem ser implementados pelas as subclasses que a herdarem. Vamos adicionar os nossos métodos em nossa
classe abstrata:
public clsPessoa()
{
}
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql.ToString();
cmd.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString());
}
catch(Exception ex)
{
throw new Exception("ERRO RUNTIME: " + ex.Message.ToString());
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
public string rg
{
get{return _rg;}
set{_rg = value;}
}
public clsPessoaFis()
{
this.cod = 0;
this.email = "";
this.telefone = "";
this.login = "";
this.senha = "";
this.cpf = "";
this.rg = "";
}
public clsPessoaFis(long cod, string nome, string email, string telefone, string login,
string senha, string cpf, DateTime dtnasc, string rg)
{
this.cod = cod;
this.nome = nome;
this.email = email;
this.telefone = telefone;
this.login = login;
this.senha = senha;
this.cpf = cpf;
this.dtnasc = dtnasc;
this.rg = rg;
}
}
Criamos uma classe concreta (clsPessoaFis) herdando de nossa classe abstrata (clsPessoa) através do ":" na definição da classe. Além disso,
utilizamos o conceito de sobreposição de métodos, criando 2 construtores para a nossa classe. Um deles sem nenhum parâmetro e o outro
com todos os dados da pessoa física para inicialização do objeto.
Note que não precisamos definir os atributos cod, nome, email, telefone, login, e senha, pois eles são herdados de nossa superclasse.
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql.ToString();
cmd.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString());
}
catch(Exception ex)
{
throw new Exception("ERRO RUNTIME: " + ex.Message.ToString());
}
finally
{
conn.Close();
conn.Dispose();
cmd.Dispose();
}
}
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql.ToString();
cmd.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString());
}
catch(Exception ex)
{
throw new Exception("ERRO RUNTIME: " + ex.Message.ToString());
}
finally
{
conn.Close();
conn.Dispose();
cmd.Dispose();
}
}
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandText = strSql.ToString();
cmd.CommandType = CommandType.Text;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
catch (OleDbException ex)
{
throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString());
}
catch(Exception ex)
{
throw new Exception("ERRO RUNTIME: " + ex.Message.ToString());
}
finally
{
conn.Close();
conn.Dispose();
cmd.Dispose();
}
}
A implementação para a nossa classe clsPessoaJur é similar a implementação que fizemos acima. Portanto, colocarei o código completo da
classe abaixo:
public class clsPessoaJur : clsPessoa
{
private string _cnpj;
private string _razao_social;
private string _insc_estatual;
public clsPessoaJur()
{
this.cod = 0;
this.email = "";
this.telefone = "";
this.login = "";
this.senha = "";
this.cnpj = "";
this.razao_social = "";
this.insc_estatual = "";
}
public clsPessoaJur(long cod, string nome, string email, string telefone, string login,
string senha, string cnpj, string razao_social, string insc_estatual)
{
this.cod = cod;
this.nome = nome;
this.email = email;
this.telefone = telefone;
this.login = login;
this.senha = senha;
this.cnpj = cnpj;
this.razao_social = razao_social;
this.insc_estatual = insc_estatual;
}
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql.ToString();
cmd.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString());
}
catch(Exception ex)
{
throw new Exception("ERRO RUNTIME: " + ex.Message.ToString());
}
finally
{
conn.Close();
conn.Dispose();
cmd.Dispose();
}
}
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql.ToString();
cmd.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString());
}
catch(Exception ex)
{
throw new Exception("ERRO RUNTIME: " + ex.Message.ToString());
}
finally
{
conn.Close();
conn.Dispose();
cmd.Dispose();
}
}
Agora que já implementamos as nossas classes de acesso ao banco de dados, vamos criar o webservice que vai utilizá-las para disponibilizar o
nosso cadastro de clientes através da internet.
Após criarmos o arquivo, iremos implementar 8 métodos de acesso público conforme descrito abaixo:
[WebMethod]
public void incluirPJ(string nome, string email, string telefone, string login, string senha,
string cnpj, string razao_social, string insc_estadual)
{
clsPessoaJur objPessoa = new clsPessoaJur();
objPessoa.nome = nome;
objPessoa.email = email;
objPessoa.telefone = telefone;
objPessoa.login = login;
objPessoa.senha = senha;
objPessoa.cnpj = cnpj;
objPessoa.razao_social = razao_social;
objPessoa.insc_estatual = insc_estadual;
objPessoa.incluir();
}
[WebMethod]
public void alterarPF(long cod, string nome, string email, string telefone, string login,
string senha, string cpf, DateTime dtnasc, string rg)
{
clsPessoaFis objPessoa = new clsPessoaFis();
objPessoa.cod = cod;
objPessoa.nome = nome;
objPessoa.email = email;
objPessoa.telefone = telefone;
objPessoa.login = login;
objPessoa.senha = senha;
objPessoa.cpf = cpf;
objPessoa.dtnasc = dtnasc;
objPessoa.rg = rg;
objPessoa.alterar();
}
[WebMethod]
public void alterarPJ(long cod, string nome, string email, string telefone, string login,
string senha, string cnpj, string razao_social, string insc_estadual)
{
clsPessoaJur objPessoa = new clsPessoaJur();
objPessoa.cod = cod;
objPessoa.nome = nome;
objPessoa.email = email;
objPessoa.telefone = telefone;
objPessoa.login = login;
objPessoa.senha = senha;
objPessoa.cnpj = cnpj;
objPessoa.razao_social = razao_social;
objPessoa.insc_estatual = insc_estadual;
objPessoa.alterar();
}
[WebMethod]
public DataSet obterPF(long cod)
{
clsPessoa objPessoa = new clsPessoaFis();
objPessoa.cod = cod;
return objPessoa.obter();
}
[WebMethod]
public DataSet obterPJ(long cod)
{
clsPessoa objPessoa = new clsPessoaJur();
objPessoa.cod = cod;
return objPessoa.obter();
}
[WebMethod]
public void excluir(long cod)
{
clsPessoa objPessoa = new clsPessoaFis();
objPessoa.cod = cod;
objPessoa.excluir();
}
[WebMethod]
public long autenticar(string login, string senha)
{
clsPessoa objPessoa = new clsPessoaFis();
objPessoa.login = login;
objPessoa.senha = senha;
long cod = objPessoa.autenticar();
return cod;
}
}
Já estamos quase no final do nosso projeto, mas antes gostaria de destacar o DataSet de retorno do método obter. A classe DataSet é a mais
importante da biblioteca de acesso a dados ADO.NET. Por esta tecnologia ser totalmente baseada em XML (o qual a difere totalmente da sua
antecessora, o ADO) ela retorna um documento XML a partir de um comando select (por exemplo) em um banco de dados, sem a necessidade
de se criar um documento XML de retorno "na mão". Esta é apenas uma das várias inovações que a tecnologia ADO.NET trouxe para os
desenvolvedore .NET.
É importante lembrar que em todos as implementações acima (classes e webservice) temos que adicionar alguns namespaces utilizados:
using System.Data;
using System.Data.OleDb;
using System.Text;
Agora é só ver e testar o resultado do nosso webservice, acessando o mesmo através do browser:
Testando o método obterPF:
Ufa! Chegamos ao fim da construção do nosso webservice. Este exemplo nos ajudou a demonstrar na prática alguns conceitos de OO que
aproximam as nossas soluções ao mundo real.
No próximo artigo, estaremos criando uma página ASP.NET que "consumirá" o nosso webservice, ou seja, utilizará os métodos públicos
disponíveis para manipulação do nosso cadastro de clientes na web.