ASP .NET - Inserindo dados no SQL Server usando um serviço WCF


Existem muitas maneiras de persistir informações em um banco de dados relacional como o SQL Server e neste artigo eu vou mostrar de forma bem simples como podemos incluir informações no SQL Server usando um serviço WCF em uma aplicação ASP .NET.

Para alcançar nosso objetivo podemos dividir nosso trabalho em 3 etapas:

  1. Definir o banco de dados e a tabela a ser atualizada;
  2. Criar um Serviço WCF;
  3. Criar uma aplicação Web ASP .NET que irá consumir o serviço;

Para realizar o trabalho eu vou usar os seguintes recursos:

  1. Visual Studio 2012 Experss for desktop (a nova versão do Microsoft Visual Web Developer 2010 Express) que é uma ferramenta grátis;
  2. SQL Server 2012 Express LocalDB (a nova versão do SQL Server Express)
SQL Server Express LocalDB é uma versão leve do SQL Server que tem muitas características de programação de um banco de dados SQL Server. O SQL Server Express LocalDB é executado no modo de usuário e tem uma instalação rápida sem a necessidade de configuração.

No Microsoft SQL Server, o banco de dados ou qualquer código Transact-SQL podem ser movidos de SQL Server Express LocalDB para o SQL Server e SQL Azure, sem quaisquer passos de atualização.

Então, o SQL Server Express LocalDB pode ser usado como um ambiente de desenvolvimento para aplicações que utilizem todas as edições do SQL Server.

O SQL Server Express LocalDB permite recursos como procedimentos armazenados, funções definidas pelo usuário e agregados, Integração com NET Framework, tipos espaciais e outros recurso que não estão disponíveis no SQL Server Compact.

Então vamos ao trabalho...

1- Definindo o banco de dados e a tabela

Para criar o banco de dados Cadastro.mdf no SQL Server 2012 Express LocalDB siga o roteiro abaixo:

Para criar a tabela Usuarios no banco de dados Cadastro.mdf siga os seguintes passos:

2- Criando o serviço WCF

A tecnologia WCF - Windows Communication Foundation, surgiu com a .NET Framework 3.0 com o objetivo de unificar as até então existentes tecnologias de programação distribuídas como: COM+ , MSMQ-Message Queue, Enterprise Services, .NET Remoting e Web Services.

Com o advento da WCF foi criada uma plataforma com uma API que facilitou de forma considerável o desenvolvimento de aplicações distribuídas visto que o WCF não esta acoplado as regras de negócio que deverão ser expostas pelo serviço.

Para iniciar com o WCF existem alguns conceitos básicos que você deve conhecer para projetar, implementar e hospedar os seus serviços. Na verdade os templates WCF fornecidos no Visual Studio simplificam muito este processo visto que eles fornecem um serviço modelo que pode ser imediatamente hospedado e testado com as ferramentas de teste WCF. Assim chamar um serviço WCF a partir de um cliente é também uma tarefa simples , basta gerar um proxy e escrever o código contra o seu modelo de objetos.

Para detalhes sobre WCF leia o meu artigo: WCF - Introdução - Macoratti.net

Abra o Visual Studio 2012 Express for web e clique em New Project;

Selecione a linguagem desejada, eu vou usar a linguagem C#, clique em WCF e selecione o template informando o nome WcfService_InserirDados;

 

Na janela Solution Explorer você deverá visualizar dois arquivos que foram criados com o projeto:

Vamos alterar o código original gerado na interface IService1.cs conforme mostrado abaixo:

using System.Runtime.Serialization;
using System.ServiceModel;
using System.Data;

namespace WcfService_InserirDados
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string InserirDetalhesUsuario(UsuarioDetalhes userInfo);

        [OperationContract]
        List<UsuarioDetalhes> ExibirUsuarios();
    }

    [DataContract]
    public class UsuarioDetalhes
    {
        [DataMember]
        public string Usuario { get; set;}

        [DataMember]
        public string Senha { get; set; }

        [DataMember]
        public string Email { get; set; }
    }
}

Definimos duas operações para o serviço:

Na estrutura DataContrat definimos a estrutura usada nos métodos definidos nos contratos. Note que a operação ExibirUsuarios() retorna uma lista de tipos UsuarioDetalhes: List<UsuarioDetalhes>.

Agora vamos alterar o código do arquivo Service1.svc onde iremos implementar os métodos definidos na interface:

using System;
using System.Data.SqlClient;
using System.Data;

namespace WcfService_InserirDados
{
    public class Service1 : IService1
    {
        public string InserirDetalhesUsuario(UsuarioDetalhes userInfo)
        {
            string Mensagem;
            SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True");
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("insert into Usuarios(usuario,senha,email) values(@Usuario,@Senha,@Email)", con);
                cmd.Parameters.AddWithValue("@Usuario", userInfo.Usuario);
                cmd.Parameters.AddWithValue("@Senha", userInfo.Senha);
                cmd.Parameters.AddWithValue("@Email", userInfo.Email);
                int resultado = cmd.ExecuteNonQuery();
                if (resultado == 1)
                {
                    Mensagem = userInfo.Usuario + " inserido com sucesso";
                }
                else
                {
                    Mensagem = userInfo.Usuario + " falha ao inserir usuário";
                }
                return Mensagem;
            }
            catch (Exception ex)
            {
                Mensagem = ex.Message;
                return Mensagem;
            }
            finally
            {
                con.Close();
            }
        }

         public List<UsuarioDetalhes> ExibirUsuarios()
        {
            List<UsuarioDetalhes> listaUsuarios = new List<UsuarioDetalhes>();
            DataTable dt = null;
            string sqlStr = @"Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True";
            using (SqlConnection con = new SqlConnection(sqlStr))
            {
                try
                {
                    con.Open();
                    // Cria um  novo DataAdapter
                    using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Usuarios", con))
                    {
                        // Usa o DataAdapter para preencher o DataTable
                        dt = new DataTable();
                        da.Fill(dt);
                    }
                    foreach (DataRow dr in dt.Rows)
                    {
                        listaUsuarios.Add(new UsuarioDetalhes { Usuario = dr["usuario"].ToString(), Email = dr["email"].ToString(), Senha = dr["senha"].ToString() });
                    }
                    return listaUsuarios;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }
}

A implementação dos métodos é bem simples e usa ADO .NET para incluir e selecionar dados na tabela Usuarios usando instruções SQL.

Observe que no método ExibirUsuarios() estamos retornando uma lista de objetos UsuariosDetalhes a partir de um DataTable.

Vamos compilar o projeto e executar o serviço. Será exibida a janela WCF Test Client carregando o serviço:

A seguir vemos os detalhes do serviço exibindo os métodos implementados. Para ver detalhes de um método clique sobre ele duas vezes conforme a figura a seguir:

Podemos visualizar o serviço no navegador clicando sobre o serviço e selecionando a opção : View in Brownser:

Criando o projeto Web ASP .NET

Vamos agora incluir um novo projeto do tipo Web Site em nossa solução. (Podemos também criar uma outra solução para consumir o serviço).

No menu FILE clique em Add -> New Web Site;

A seguir selecione o template ASP .NET Empty Web Site e informe o nome WebSite_ConsumirWcf e clique no botão OK;

Agora vamos incluir uma referência ao serviço criado no nosso WebSite.

Clique com o botão direito do mouse sobre o projeto WebSite e selecione a opção Add Service Reference;

Na janela Add Service Reference clique no botão Discover e a seguir em Services in Solution;

Será exibido o serviço que criamos e se clicarmos sobre o IService1 veremos as operações implementadas:

Clicando o botão OK teremos a referência incluída em nosso projeto Web:

Agora vamos incluir uma nova página em nosso projeto para consumir o serviço.

No menu WEBSITE clique em Add New Item e selecione o template Web Form aceitando o nome Default.aspx

Abra a página Default.aspx no modo Design e no menu TABLE clique em Insert table e inclua uma tabela com 8 linhas e duas colunas na pagina;

A seguir inclua os seguintes controles a partir da ToolBox na página na tabela:

Defina os controles na página conforme o leiaute da figura abaixo:

Agora vamos abrir o arquivo Default.aspx.cs e no code-behind definir os namespaces usados:

using System;
using System.Linq;
using ServiceReference1;

A seguir vamos criar uma instância do serviço criado:

ServiceReference1.Service1Client objServiceClientobjService = new ServiceReference1.Service1Client();

No evento Click do botão de comando Salvar inclua o código que irá gravar as informações na tabela Usuarios:

 protected void btnSalvar_Click(object sender, EventArgs e)
    {
        try
        {
            UsuarioDetalhes userInfo = new UsuarioDetalhes();
            userInfo.Usuario = txtUsuario.Text;
            userInfo.Senha = txtSenha.Text;
            userInfo.Email = txtEmail.Text;
            string resultado = objServiceClientobjService.InserirDetalhesUsuario(userInfo);
            lblMensagem.Text = resultado;
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message;
        }
    }

No evento Click do botão de comando Exibir Usuários insira o código abaixo para exibir os usuários no controle GridView:

protected void bnExibir_Click(object sender, EventArgs e)
    {
        gdvUsuarios.DataSource = objServiceClientobjService.ExibirUsuarios().ToList();
        gdvUsuarios.DataBind();
    }

Executando o projeto teremos o resultado abaixo:

1- Incluindo um usuário

2- Exibindo o usuário incluído

Segue o projeto completo aqui: WcfService__InserirDados.zip

Rom 8:1 Portanto, agora nenhuma condenação há para os que estão em Cristo Jesus.
Rom 8:2 Porque a lei do Espírito da vida, em Cristo Jesus, te livrou da lei do pecado e da morte.

Referências:


José Carlos Macoratti