12
Criando um WebService para controle de Clientes utilizando C# Publicado em: 14/04/2005 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 Um Web Service Para Controle de Clientes Utilizando C#

Embed Size (px)

Citation preview

Page 1: Criando Um Web Service Para Controle de Clientes Utilizando C#

Criando um WebService para controle de Clientes utilizando C#

Publicado em: 14/04/2005

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

Page 2: Criando Um Web Service Para Controle de Clientes Utilizando C#

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:

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

Page 3: Criando Um Web Service Para Controle de Clientes Utilizando C#

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

public abstract void incluir();

public abstract void alterar();

public abstract DataSet obter();

public virtual void excluir() { string strConn = System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString();

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").ToString(); 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 métodos abstratos, os quais serão implementados somente nas classes que herdarem esta classe (no nosso projeto, as classes clsPessoaFis e clsPessoaJur). Temos dois métodos (excluir e autenticar) que fazem a mesma coisa tanto para pessoa física quanto para pessoa jurídica, portanto, é necessário implementá-los 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;

Page 4: Criando Um Web Service Para Controle de Clientes Utilizando C#

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) 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.

Vamos agora implementar os nossos métodos para a nossa classe:

public override void incluir() { string strConn = System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString();

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

Page 5: Criando Um Web Service Para Controle de Clientes Utilizando C#

public override void alterar() { string connString = System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString();

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

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 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;

Page 6: Criando Um Web Service Para Controle de Clientes Utilizando C#

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

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, ");

Page 7: Criando Um Web Service Para Controle de Clientes Utilizando C#

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

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 através da internet.

Adicione um novo item ao projeto (WebService):

Page 8: Criando Um Web Service Para Controle de Clientes Utilizando C#

Após criarmos o arquivo, iremos implementar 8 métodos de acesso público conforme descrito abaixo:

incluirPF: inclui uma pessoa física.incluirPJ: inclui uma pessoa jurídica.alterarPF: altera uma pessoa física cadastrada.alterarPJ: altera uma pessoa jurídica cadastrada.obterPF: obtém um DataSet contendo os dados de uma pessoa física.obterPJ: obtém um DataSet contendo os dados de uma pessoa jurídica.excluir: exclui uma pessoa (física ou jurídica) cadastrada.autenticar: verifica se uma pessoa (física ou jurídica) está cadastrada a partir do seu login e senha cadastrados e retorna o seu código.

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;

Page 9: Criando Um Web Service Para Controle de Clientes Utilizando C#

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:

Page 10: Criando Um Web Service Para Controle de Clientes Utilizando C#

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

Page 11: Criando Um Web Service Para Controle de Clientes Utilizando C#

disponíveis para manipulação do nosso cadastro de clientes na web.

Clique aqui para baixar o código fonte completo do nosso projeto.