WCF - Consumindo um serviço com dados no SQL Server (VB.NET)


Este artigo apresenta como consumir um serviço que consulta dados no SQL Server 2008 usando a linguagem VB .NET.

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

Na primeira etapa, vamos utilizar um banco de dados existente no SQL Server, depois disso criamos uma função simples para consultar 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 consultados e exibidos em um controle gridivew.

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

O banco de dados e a tabela

Usaremos o banco de dados chamado Escola e a tabela Usuarios cuja estrutura e dados são exibidas abaixo:

Criando o serviço WCF

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

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;

uImports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.Data

Namespace WcfService_GDV
    <ServiceContract()> _
    Public Interface IService1
        <OperationContract()> _
        Function GetUsuarios() As Usuario
    End Interface

    <DataContract()> _
    Public Class Usuario
        <DataMember()> _
        Public Property tabelaUsuario() As DataTable
            Get
                Return m_tabelaUsuario
            End Get
            Set(ByVal value As DataTable)
                m_tabelaUsuario = Value
            End Set
        End Property
        Private m_tabelaUsuario As DataTable
    End Class

End Namespace

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: GetUsuarios e o contrato de dados Usuario.

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 GetUsuarios na classe Service1 no arquivo code-behind Service.svc digitando o código conforme abaixo:

Imports System.Configuration
Imports System.Data.SqlClient
Imports System.Data

Namespace WcfService_GDV
    Public Class Service1
        Implements IService1

        Private conString As String = ConfigurationManager.ConnectionStrings("conexaoSQL").ConnectionString
        Private con As SqlConnection
        Private cmd As SqlCommand
        Private da As SqlDataAdapter
        Private dt As DataTable

        Private usuario As New Usuario()

        Public Function GetUsuarios() As Usuario Implements IService1.GetUsuarios
            Using con = New SqlConnection(conString)
                cmd = New SqlCommand("Select top 10 * from Usuarios", con)
                da = New SqlDataAdapter(cmd)
                dt = New DataTable("Paging")
                da.Fill(dt)
                usuario.tabelaUsuario = dt
                Return usuario
            End Using
        End Function
    End Class
End Namespace

Observe que estamos referenciando o namespace System.Configuration; para isso temos que incluir uma referência no projeto web via menu Project -> Add Reference;

Selecionando em seguida a guia .NET e o item System.Configuration:

Não podemos esquecer de definir a string de conexão com o banco de dados no arquivo web.config conforme abaixo:

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <add
      name="conexaoSQL"
      connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Escola;Integrated Security=True;" />
  </connectionStrings>
  
  <system.web>
  .....

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

Teremos a exibição do serviço e do método GetUsuarios() definido:

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:61404/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 selecine o template ASP .NET Web Application e informe o nome ConsultarDadosWeb;

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 GetUsuarios do serviço;

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

Agora abra a página Default.aspx e inclua um controle GridView a partir da ToolBox;

A seguir, no evento Load da página, inclua o código abaixo que irá instanciar o serviço criado e usar o método exposto para inserir dados no SQL Server;

Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim servico As New ServiceReference1.Service1Client()
        Dim _usuario As New ServiceReference1.Usuario()
        _usuario = servico.GetUsuarios()
        Dim dt As New DataTable()
        dt = _usuario.tabelaUsuario
        GridView1.DataSource = dt.DefaultView
        GridView1.DataBind()
    End Sub

End Class 

Obtemos os dados do formulário e após criar uma instância do serviço usamos o método GetUsuarios para obter as informações da tabela e exibir o resultado no controle GridView:

Execute a aplicação e a tela abaixo será apresentada:

Vimos assim como é simples usar os recursos do WCF para obter informações no SQL Server.

Em outro artigo irei mostrar como realizar as operações CRUD usando um serviço WCF.

Aguarde : WCF - Inserindo dados no SQL Server

Pegue o projeto completo aqui: WcfService_GDV_VB.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