WCF - Inserindo dados no SQL Server


Este artigo apresenta o modo de inserir dados em SQL Server 2008 usando um serviço WCF a partir de código C#.

Para inserir dados em um banco de dados SQL Server usando um serviço WCF, devemos fazer realizar as seguintes ações:

Na primeira etapa, vamos criar um banco de dados e a tabela no SQL Server, depois disso criamos uma função simples para inserir dados no banco de dados usando um serviço WCF.

A seguir criaremos uma aplicação web onde vamos incluir uma referência ao serviço e aos dados a serem inseridos sendo que as informações serão enviados para a função de serviços e serão inseridos na tabela do banco de dados.

A aplicação exemplo foi desenvolvida no Visual Web Developer 2010 Express(VWD 2010) e no SQL Server 2008.

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

Criando o banco de dados

Crie o banco de dados chamado Escola usando o SQL Server Management Studio e a seguir crie a tabela Acesso contendo os campos : id, login, senha e email:

O comando SQL para criar a tabela pode ser :

CREATE TABLE [dbo].[Acesso]
(

      [login] [varchar](50) NOT NULL,
      [senha] [varchar](50) NOT NULL,
      [email] [varchar](150) NOT NULL
)

Criando o serviço WCF

A seguir crie o projeto WCF usando o VWD 2010 com o nome WcfService_InserirDados_SQLServer;

Abra o VWD 2010 Express e no menu File clique em New Project;

Selecione a linguagem C# e o template WCF e a seguir WCF Service Application;

Informe o nome WcfService_InserirDados_SQLServer e clique em OK;

Será criado um projeto com a estrutura abaixo mostrada na janela Solution Explorer:

Vamos definir o contrato e o contrato de dados na interface IService conforme o código a seguir:

Lembre-se que a interface define apenas as assinaturas dos métodos que deverão ser implementados por uma classe concreta;

using System.ServiceModel;

namespace WcfService_InserirDados_SQLServer
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string InserirUsuarios(Usuarios _usuario);
    }

    [DataContract]
    public class Usuarios
    {
        int _id;
        string _login = string.Empty;
        string _senha = string.Empty;
        string _email = string.Empty;

        [DataMember]
        public string Login
        {
            get { return _login; }
            set { _login = value; }
        }
        [DataMember]
        public string Senha
        {
            get { return _senha; }
            set { _senha = value; }
        }
        [DataMember]
        public string Email
        {
            get { return _email; }
            set { _email = value; }
        }
        [DataMember]
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }
    }
}

A primeira etapa para criar um serviço WCF e efetuar a definição do contrato pois é o contrato
que vai definir quais operações serão expostas pelo serviço, que informações são necessárias para
que essas operações sejam executadas e qual o tipo de retorno esperado.

Obs: O contrato é uma interface que contém as assinaturas dos métodos que serão expostos.
A interface deverá ser decorada com o atributo:
ServiceContract

Contratos de serviços (Service Contracts) - Descrevem as operações que um serviço pode
realizar. (Mapeia os tipos CLR para WSDL).

Contratos de Dados (Data Contracts) - Descreve a estrutura de dados usada no serviço.
(Mapeia tipos CLR para XSD)
.  Um Data Contract é um acordo formal entre um serviço e um
cliente que descreve os dados que serão trocados entre ambos. Para estabelecer a comunicação,
o cliente e o serviço não necessitam trocar necessariamente os mesmos tipos de dados,
devem trocar apenas os mesmos data contracts
.

Um Data Contract especifica para cada parâmetro ou tipo de retorno qual informação será
serializada (convertida em XML) para ser trocada.  Os
DataContracts são definidos através de
classes
e uma classe DataContract deverá ser decorada com o atributo DataContract e os
campos e propriedades que o tipo possui devem ser decorados com o atributo DataMember.
(A
partir do service pack  versão 3.5 da plataforma .NET isso não é mais obrigatório)

Definimos o contrato de serviço: InserirUsuarios e o contrato de dados Usuarios.

Neste processo realizamos as seguintes tarefas:

  • Definimos um contrato. (Uma Interface comum)
  • Implementamos o contrato. (Usamos uma Classe que implementa a interface)
  • Hospedamos o serviço. (VS hospeda o serviço no IIS local)
  • Referenciamos o serviço e chamamos o serviço a partir do cliente.(aplicação web)

Agora vamos implementar o método InserirUsuarios na classe Service1 no arquivo code-behind Service.svc digitando o código conforme abaixo:

using System.Data.SqlClient;

namespace WcfService_InserirDados_SQLServer
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class Service1 : IService1
    {
        public string InserirUsuarios(Usuarios usuario)
        {
            string Mensagem;
            SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=Escola;Integrated Security=True;");
            con.Open();
            SqlCommand cmd = new SqlCommand("insert into Acesso(login,senha,email) values(@Login,@Password,@Email)", con);
            cmd.Parameters.AddWithValue("@Login", usuario.Login);
            cmd.Parameters.AddWithValue("@Password", usuario.Senha);
            cmd.Parameters.AddWithValue("@Email", usuario.Email);
            int resultado = cmd.ExecuteNonQuery();
            if (resultado == 1)
            {
                Mensagem = usuario.Login + " inserido com sucesso.";
            }
            else
            {
                Mensagem = usuario.Login + " não foi inserido.";
            }
            con.Close();
            return Mensagem;
         }
      }
}

Pressione F5 para executar o serviço. Um formulário WCF Test Client será exibido e vai executar o serviço.

Agora clique duas vezes sobre o método InserirUsuarios() da interface IService1. A guia InserirUsuarios será exibida.

Após isso o serviço foi adicionado com êxito.

Vamos agora abrir o serviço no navegador, para isso com o botão direito do mouse clique sobre o arquivo service1.vcs e a seguir em View in Browser;

Copie a URL : http://localhost:58779/Service1.svc (no seu exemplo provavelmente a porta será diferente) para usá-la mais adiante.

Criando a aplicação WEB

Vamos criar a aplicação WEB que irá consumir o serviço WCF criado.

No menu File clique em Add -> New Project selecione o template ASP .NET Web Application e informe o nome AdicionarUsuarios;

Vamos incluir no projeto web a referência ao serviço WCF.

Clique com o botão direito do mouse sobre o Projeto Web e selecione o item Add Service Reference...

Será aberta a janela mostrada abaixo:

Vamos colar URL que copiamos quando abrimos o serviço no navegador na caixa de texto Address e clicar no botão Go:

Deveremos ver o serviço criado e na área Operations o método InserirUsuarios do serviço;

Clique no botão OK para incluir a referência no projeto:

Agora abra a página Default.aspx e digite o código abaixo para gerar a interface com usuário.

Iremos criar uma página com 3 campos para incluir os dados de login, senha e email na tabela Acesso;

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="InserirUsuariosWeb._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
      <div>
      <table width="84%" cellpadding="0" cellspacing="0" style="border: solid 1px #3366CC;">
            <tr>
                <td colspan="4" style="height: 30px; background-color: #f5712b;">
                    <span class="TextTitle" style="color: #FFFFFF;">Formulário de Registro</span>
                </td>
            </tr>
            <tr>
                <td height="20px" colspan="0">
                </td>
            </tr>
            <tr>
                <td width="50%" valign="top">
                    <table id="TableLogin" class="HomePageControlBGLightGray" cellpadding="4" cellspacing="4"
                        runat="server" width="100%">
                        <tr>
                            <td colspan="3" align="center">
                                <asp:Label ID="LabelMessage" ForeColor="Red" runat="server" EnableViewState="False"
                                    Visible="False"></asp:Label><br>
                           </td>
                        </tr>
                        <tr style="font-weight: normal; color: #000000">
                            <td align="right">
                                <span>Login :</span>;
                            </td>
                            <td align="left" style="padding-left: 10px;">
                                <asp:TextBox ID="TextBoxUserName" runat="server" CssClass="textbox" Width="262px"
                                    MaxLength="50" Height="34px"></asp:TextBox>
                            </td>
                        </tr>
                        <tr>
                            <td align="right">
                                <span class="TextTitle">Senha :</span>
                            </td>
                            <td align="left" style="padding-left: 10px;">
                                <asp:TextBox ID="TextBoxPassword" runat="server" CssClass="textbox" Width="261px"
                                    MaxLength="50" TextMode="Password" Height="34px"></asp:TextBox>
                                <br />
                            </td>
                        </tr>
                          <tr>
                            <td align="right">
                                <span class="TextTitle">Email :</span>
                            </td>
                            <td align="left" style="padding-left: 10px;">
                                <asp:TextBox ID="TextBoxEmail" runat="server" CssClass="textbox" Width="261px"
                                    MaxLength="50" Height="34px"></asp:TextBox>
                                <br />
                            </td>
                        </tr>
                        <tr>
                            <td align="right">
                            </td>
                            <td align="left" style="padding-left: 10px;">
                                <asp:Button ID="Button1" runat="server" Text="Inserir" OnClick="Button1_Click" Width="87px" />
                                <br />
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
</asp:Content>

A aparência do formulário deverá ser a seguinte:

No evento Click do botão de comando inclua o código abaixo que irá instanciar o serviço criado e usar o método exposto para inserir dados no SQL Server;

using System;
using InserirUsuariosWeb.ServiceReference1;

namespace InserirUsuariosWeb
{
    public partial class _Default : System.Web.UI.Page
    {
        ServiceReference1.Service1Client servicoReferencia = new ServiceReference1.Service1Client();

        protected void Page_Load(object sender, EventArgs e)
        {}

        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                Usuarios _usuario = new Usuarios();
                _usuario.Login = TextBoxUserName.Text;
                _usuario.Senha = TextBoxPassword.Text;
                _usuario.Email = TextBoxEmail.Text;
                string resultado = servicoReferencia.InserirUsuarios(_usuario);
                LabelMessage.Text = resultado;
            }
            catch (Exception ex)
            {
                LabelMessage.Text = ex.Message;
            }
        }
    }
}

Obtemos os dados do formulário e após criar uma instância do serviço usamos o método InserirUsuarios passando o objeto _usuarios com as informações para inclusão no SQL Server.

Execute a aplicação e a tela abaixo será apresentada. Informando alguns valores e clicando em Inserir:

Examinando o banco de dados Escola e a tabela Acesso com o SQL Server Management Studio veremos a informação gravada no banco de dados:

Vimos assim como é simples usar os recursos do WCF para gerenciar informações no SQL Server. Em outro artigo irei mostrar como realizar as operações CRUD usando um serviço WCF.

Pegue o projeto completo aqui: WcfService_InserirDados_SQLServer.zip

Joã 3:31 Aquele que vem de cima é sobre todos; aquele que vem da terra é da terra, e fala da terra. Aquele que vem do céu é sobre todos.

Joã 3:32 Aquilo que ele tem visto e ouvido, isso testifica; e ninguém aceita o seu testemunho.

Joã 3:33 Mas o que aceitar o seu testemunho, esse confirma que Deus é verdadeiro.

Joã 3:34 Pois aquele que Deus enviou fala as palavras de Deus; porque Deus não dá o Espírito por medida.

Joã 3:35 O Pai ama ao Filho, e todas as coisas entregou nas suas mãos.

Joã 3:36 Quem crê no Filho tem a vida eterna; o que, porém, desobedece ao Filho não verá a vida, mas sobre ele permanece a ira de Deus.

Referências:


José Carlos Macoratti