Você está na página 1de 16

Criando um WebService para

controle de Clientes utilizando


C#
O objetivo deste artigo
desenvolver um sistema de
cadastro de clientes acessvel
atravs de um WebService, o
qual poder ser utilizado por
outros sites que consumirem o
WebService, possibilitando a
incluso, alterao, excluso,
consulta e autenticao de
clientes pessoa fsica e pessoa
jurdica.
por Jones Avelino
21 35 0 30

O objetivo deste artigo desenvolver um sistema de cadastro de clientes


acessvel atravs de um WebService, o qual poder ser utilizado por outros sites
que consumirem o WebService, possibilitando a incluso, alterao, excluso,
consulta e autenticao de clientes pessoa fsica e pessoa jurdica.
Nosso webservice dever permitir o cadastro de pessoas fsica e jurdica,
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 deciso de projeto, e teramos
pelo menos mais 2 formas possveis de fazer este mapeamento, criando uma
tabela para cada classe ou criando duas tabelas (pessoa fsica e pessoa jurdica)
e repetindo os atributos de pessoa em cada uma delas.
Agora hora de criarmos os nossos arquivos de classes, responsveis
basicamente por acessar o nosso banco de dados de clientes e efetuar as
operaes propostas pelo nosso projeto (incluso, alterao, excluso, consulta
e autenticao 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 no poder ser instanciada
diretamente. Vamos escrever o cdigo para criao de nossos atributos e
mtodos conforme o nosso diagrama de classes:
public abstract class clsPessoa
{
//Definindo propriedades
private long _cod;
private string _nome;
private string _email;
private string _telefone;
private string _login;
private string _senha;
public long cod
{
get{return _cod;}
set{_cod = value;}
}
public string nome
{
get{return _nome;}
set{_nome = value;}
}
public string email
{
get{return _email;}
set{_email = value;}
}

public string telefone


{
get{return _telefone;}
set{_telefone = value;}
}
public string login
{
get{return _login;}
set{_login = value;}
}
public string senha
{
get{return _senha;}
set{_senha = value;}
}
}

Note que at agora, criamos a nossa classe abstrata e os nossos atributos


(propriedades). Uma classe abstrata se ela possui ao menos um mtodo
abstrato e tais mtodos devem ser implementados pelas as subclasses que a
herdarem. Vamos adicionar os nossos mtodos em nossa classe abstrata:
public clsPessoa()
{
}
public abstract void incluir();
public abstract void alterar();
public abstract DataSet obter();
public virtual void excluir()
{
string strConn =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("DELETE FROM clientes ");
strSql.Append("WHERE cod = @cod;");
OleDbConnection conn = new OleDbConnection(strConn);
OleDbParameter param = new OleDbParameter("@cod", this.cod);
OleDbCommand cmd = new OleDbCommand();
cmd.Parameters.Add(param);
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 virtual long autenticar()
{
string strConn =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("SELECT cod ");
strSql.Append("FROM clientes WHERE login = @login AND senha = @senha;");
OleDbConnection conn = new OleDbConnection(strConn);
OleDbParameter[] param = new OleDbParameter[2];
param[0] = new OleDbParameter("@login", this.login);
param[1] = new OleDbParameter("@senha", this.senha);
OleDbCommand cmd = new OleDbCommand();
cmd.Parameters.Add(param[0]);
cmd.Parameters.Add(param[1]);
long ret = 0;
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSql.ToString();
ret = Convert.ToInt64(cmd.ExecuteScalar());
}
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();
}
return ret;
}
Veja que utilizamos o modificador abstract para criar os nosso mtodos
abstratos, os quais sero implementados somente nas classes que herdarem
esta classe (no nosso projeto, as classes clsPessoaFis e clsPessoaJur). Temos

dois mtodos (excluir e autenticar) que fazem a mesma coisa tanto para
pessoa fsica quanto para pessoa jurdica, portanto, necessrio implementlos apenas na superclasse e herd-los em nossas subclasses. Para isso,
utilizamos o modificador virtual. Agora, temos que implementar as nossas
duas subclasses (clsPessoaFis e clsPessoaJur) herdando de nossa classe
abstrata clsPessoa. Primeiro, vamos implementar os atributos da nossa
classe clsPessoaFis conforme nosso diagrama de classes:
public class clsPessoaFis : clsPessoa
{
private string _cpf;
private DateTime _dtnasc;
private string _rg;
public string cpf
{
get{return _cpf;}
set{_cpf = value;}
}
public DateTime dtnasc
{
get{return _dtnasc;}
set{_dtnasc = value;}
}
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) atravs do ":" na definio da classe. Alm disso,

utilizamos o conceito de sobreposio de mtodos, criando 2 construtores


para a nossa classe. Um deles sem nenhum parmetro e o outro com todos os
dados da pessoa fsica para inicializao do objeto.
Note que no precisamos definir os atributos cod, nome, email, telefone,
login, e senha, pois eles so herdados de nossa superclasse.
Vamos agora implementar os nossos mtodos para a nossa classe:
public override void incluir()
{
string strConn =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("INSERT INTO clientes (nome, email, telefone, login, senha, cpf,
dtnasc, rg)");
strSql.Append("VALUES(@nome, @email, @telefone, @login, @senha, @cpf,
@dtnasc, @rg)");
OleDbConnection conn = new OleDbConnection(strConn);
OleDbParameter[] param = new OleDbParameter[8];
param[0] = new OleDbParameter("@nome", this.nome);
param[1] = new OleDbParameter("@email", this.email);
param[2] = new OleDbParameter("@telefone", this.telefone);
param[3] = new OleDbParameter("@login", this.login);
param[4] = new OleDbParameter("@senha", this.senha);
param[5] = new OleDbParameter("@cpf", this.cpf);
param[6] = new OleDbParameter("@dtnasc", this.dtnasc);
param[7] = new OleDbParameter("@rg", this.rg);
param[6].OleDbType = OleDbType.Date;
OleDbCommand cmd = new OleDbCommand();
for(byte i = 0;i < param.Length;i++)
{
cmd.Parameters.Add(param[i]);
}

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();
}

public override void alterar()


{
string connString =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("UPDATE clientes SET ");
strSql.Append(" nome = @nome, ");
strSql.Append(" email = @email, ");
strSql.Append(" telefone = @telefone, ");
strSql.Append(" login = @login, ");
strSql.Append(" senha = @senha, ");
strSql.Append(" cpf = @cpf, ");
strSql.Append(" dtnasc = @dtnasc, ");
strSql.Append(" rg = @rg ");
strSql.Append("WHERE cod = @cod;");
OleDbConnection conn = new OleDbConnection(connString);
OleDbParameter[] param = new OleDbParameter[9];
param[0] = new OleDbParameter("@nome", this.nome);
param[1] = new OleDbParameter("@email", this.email);
param[2] = new OleDbParameter("@telefone", this.telefone);
param[3] = new OleDbParameter("@login", this.login);
param[4] = new OleDbParameter("@senha", this.senha);
param[5] = new OleDbParameter("@cpf", this.cpf);
param[6] = new OleDbParameter("@dtnasc", this.dtnasc);
param[7] = new OleDbParameter("@rg", this.rg);
param[8] = new OleDbParameter("@cod", this.cod);
param[6].OleDbType = OleDbType.Date;
OleDbCommand cmd = new OleDbCommand();
for(byte i = 0;i < param.Length;i++)
{
cmd.Parameters.Add(param[i]);
}
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();
}
}

public override DataSet obter()


{
string connString =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("SELECT cod, nome, email, telefone, login, senha, cpf, dtnasc, rg
");

strSql.Append("FROM clientes WHERE cod = @cod");


OleDbConnection conn = new OleDbConnection(connString);
OleDbParameter param = new OleDbParameter("@cod", this.cod);
OleDbCommand cmd = new OleDbCommand();
cmd.Parameters.Add(param);
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 implementao para a nossa classe clsPessoaJur similar a implementao
que fizemos acima. Portanto, colocarei o cdigo completo da classe abaixo:
public class clsPessoaJur : clsPessoa
{
private string _cnpj;
private string _razao_social;
private string _insc_estatual;
public string cnpj
{
get{return _cnpj;}
set{_cnpj = value;}
}
public string razao_social
{
get{return _razao_social;}

set{_razao_social = value;}

public string insc_estatual


{
get{return _insc_estatual;}
set{_insc_estatual = value;}
}
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;
}
public override void incluir()
{
string strConn =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("INSERT INTO clientes (nome, email, telefone, login, senha, cnpj,
razao_social,
insc_estatual)");
strSql.Append("VALUES(@nome, @email, @telefone, @login, @senha, @cnpj,
@razao_social,
@insc_estatual)");
OleDbConnection conn = new OleDbConnection(strConn);
OleDbParameter[] param = new OleDbParameter[8];
param[0] = new OleDbParameter("@nome", this.nome);
param[1] = new OleDbParameter("@email", this.email);
param[2] = new OleDbParameter("@telefone", this.telefone);
param[3] = new OleDbParameter("@login", this.login);
param[4] = new OleDbParameter("@senha", this.senha);
param[5] = new OleDbParameter("@cnpj", this.cnpj);
param[6] = new OleDbParameter("@razao_social", this.razao_social);
param[7] = new OleDbParameter("@insc_estatual", this.insc_estatual);

OleDbCommand cmd = new OleDbCommand();


for(byte i = 0;i < param.Length;i++)
{
cmd.Parameters.Add(param[i]);
}
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();
}
}
public override void alterar()
{
string connString =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("UPDATE clientes SET ");
strSql.Append(" nome = @nome, ");
strSql.Append(" email = @email, ");
strSql.Append(" telefone = @telefone, ");
strSql.Append(" login = @login, ");
strSql.Append(" senha = @senha, ");
strSql.Append(" cnpj = @cnpj, ");
strSql.Append(" razao_social = @razao_social, ");
strSql.Append(" insc_estatual = @insc_estatual ");
strSql.Append("WHERE cod = @cod;");
OleDbConnection conn = new OleDbConnection(connString);
OleDbParameter[] param = new OleDbParameter[9];
param[0] = new OleDbParameter("@nome", this.nome);
param[1] = new OleDbParameter("@email", this.email);
param[2] = new OleDbParameter("@telefone", this.telefone);
param[3] = new OleDbParameter("@login", this.login);
param[4] = new OleDbParameter("@senha", this.senha);
param[5] = new OleDbParameter("@cnpj", this.cnpj);
param[6] = new OleDbParameter("@razao_social", this.razao_social);
param[7] = new OleDbParameter("@insc_estatual", this.insc_estatual);
param[8] = new OleDbParameter("@cod", this.cod);
OleDbCommand cmd = new OleDbCommand();

for(byte i = 0;i < param.Length;i++)


{
cmd.Parameters.Add(param[i]);
}

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();
}

public override DataSet obter()


{
string connString =
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").To
String();
StringBuilder strSql = new StringBuilder("");
strSql.Append("SELECT cod, nome, email, telefone, login, senha, cnpj,
razao_social, insc_estatual ");
strSql.Append("FROM clientes WHERE cod = @cod");
OleDbConnection conn = new OleDbConnection(connString);
OleDbParameter param = new OleDbParameter("@cod", this.cod);
OleDbCommand cmd = new OleDbCommand();
cmd.Parameters.Add(param);
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();
}
}

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 atravs da internet.
Adicione um novo item ao projeto (WebService):

Aps criarmos o arquivo, iremos implementar 8 mtodos de acesso pblico


conforme descrito abaixo:
incluirPF: inclui uma pessoa fsica.
incluirPJ: inclui uma pessoa jurdica.
alterarPF: altera uma pessoa fsica cadastrada.
alterarPJ: altera uma pessoa jurdica cadastrada.
obterPF: obtm um DataSet contendo os dados de uma pessoa fsica.
obterPJ: obtm um DataSet contendo os dados de uma pessoa jurdica.
excluir: exclui uma pessoa (fsica ou jurdica) cadastrada.
autenticar: verifica se uma pessoa (fsica ou jurdica) est cadastrada a partir
do seu login e senha cadastrados e retorna o seu cdigo.
public class WsClientes : System.Web.Services.WebService
{
[WebMethod]
public void incluirPF(string nome, string email, string telefone, string login, string
senha,
string cpf, DateTime dtnasc, string rg)

clsPessoaFis objPessoa = new clsPessoaFis();


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.incluir();

[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 mtodo 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 comandoselect (por exemplo) em
um banco de dados, sem a necessidade de se criar um documento XML de
retorno "na mo". Esta apenas uma das vrias inovaes que a tecnologia
ADO.NET trouxe para os desenvolvedore .NET.
importante lembrar que em todos as implementaes 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
atravs do browser:

Testando o mtodo obterPF:

Ufa! Chegamos ao fim da construo do nosso webservice. Este exemplo nos


ajudou a demonstrar na prtica alguns conceitos de OO que aproximam as
nossas solues ao mundo real.

Você também pode gostar