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:
- Criar o banco de dados e a tabela no SQL Server(ou usar um banco de dados e tabelas existentes);
- Criar um WCF Service;
- Criar um aplicativo web que usará o serviço WCF.
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 está acoplado às 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 noVisual 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; depois 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 e 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; eles 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> .....
Agora 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, selecione 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 a 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.
Pegue o projeto completo aqui: WcfService_GDV_VB.zip