C# - CRUD no SQL Server com Dapper e MetroFramework usando um WebService - I


 

 Neste artigo vamos criar uma aplicação Windows Forms onde vamos implementar as operações CRUD no banco de dados SQL Server usando o micro-ORM Dapper em um Web Service.

A seguir vou mostrar como consumir o web service em nossa aplicação Windows Forms usando a linguagem C#.

Se você deseja ou precisa usar o estilo Metro em aplicações Windows Forms você pode usar o framework MetroFramework que fornece os recursos para criar interfaces nesse estilo de forma relativamente simples e gratuita. Veja o meu artigo sobre como usar o MetroFramework:  VB .NET - Implementando interfaces ao estilo Metro com ... - Macoratti

Muitas vezes precisamos apenas criar uma aplicação básica com acesso a dados que faça apenas a manutenção dos dados e para isso não vale a pena usar uma ferramenta ORM como o Entity Framework ou NHibernate que são mais indicadas para projetos mais complexos. Uma solução, se você não quer usar ADO .NET puro é usar um micro ORM que apresenta recursos que vão facilitar o desenvolvimento e que tenha desempenho. É justamente aqui que o Dapper se encaixa.  Veja o meu artigo sobre como usar o Dapper:  ADO .NET - Usando o Micro ORM Dapper - Macoratti

Agora imagine  um componente cujos recursos  possam ser acessados na Internet via TCP/IP,  independente do Sistema Operacional  e de qualquer lugar como se o componente estivesse instalado na sua máquina ; um componente que não sofresse as restrições dos Firewalls e que fosse totalmente integrado ao seu ambiente. Estou falando de WebServices.

 

Não é uma ideia nova, já existem muitos sites que oferecem serviços como : cotações de ações , moedas , etc. ; o problema é que você tem que se adequar a cada um dos ambientes que oferecem o serviço.

 

A estratégia da Microsoft com a plataforma .NET esta focada na integração dos sistemas distribuídos na Web; na plataforma .NET ela oferece ferramentas para que a criação de serviços e sua distribuição na Web possa ser feita de forma rápida e simples.

 

E quanto ao protocolo de  comunicação que permite a integração destes sistemas ?  É aqui que entra o protocolo SOAP (Simple Object Access Protocol ). Ele é o responsável pela comunicação entre o cliente os sistemas e os serviços , pois permite que diferentes aplicações troquem dados de forma semelhante ao protocolo HTTP com GET e POST.

Embora os web services tenham evoluído e hoje em dia são usados como serviços REST neste artigo vou implementar o CRUD em um web service para gerenciar as informações de funcionários existentes em uma tabela do banco de dados SQL Server.

Para isso crei o banco Cadastro.mdf no SQL Management Studio e a tabela Funcionarios com a seguinte estrutura:

 

 

Também criei 2 procedimentos armazenados no SQL Server para realizar a edição e inclusão dos dados e assim mostrar como usar o recurso com o Dapper.

 

1- Abaixo temos o código do procedimento armazenado: sp_Funcionarios_Atualizar
 

USE [Cadastro]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[sp_Funcionarios_Atualizar]
(
     @FuncionarioID int output,
	 @Nome nvarchar(100),
	 @Email nvarchar(150),
	 @Telefone nvarchar(50),
	 @Endereco nvarchar(150),
	 @Cargo nvarchar(50),
	 @ImagemUrl nvarchar(250)
)
as
    update Funcionarios set Nome=@Nome, Email=@Email, Telefone=@Telefone, Endereco=@Endereco, Cargo=@Cargo, ImagemUrl=@ImagemUrl
	where FuncionarioID=@FuncionarioID

 

2- A seguir temos o código do procedimento armazenado: sp_Funcionarios_Inserir :
 

USE [Cadastro]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[sp_Funcionarios_Inserir]
(
     @FuncionarioID int output,
	 @Nome nvarchar(100),
	 @Email nvarchar(150),
	 @Telefone nvarchar(50),
	 @Endereco nvarchar(150),
	 @Cargo nvarchar(50),
	 @ImagemUrl nvarchar(250)
)
as
    insert into Funcionarios(Nome,Email,Telefone,Endereco,Cargo,ImagemUrl)
	values(@Nome,@Email,@Telefone,@Endereco,@Cargo,@ImagemUrl)
	set @FuncionarioID = SCOPE_IDENTITY()


Recursos Usados :

Criando o projeto Windows Forms e o Web Service no VS 2017

Abra o VS 2017 Community e crie um novo projeto (File-> New Project) usando a linguagem Visual C# e o template Windows Classic Desktop ->Windows Forms Application(.NET Framework)

Informe um nome a seu gosto. Eu vou usar o nome CRUD_Dapper. Esse será o nosso projeto Windows Forms.

A seguir vamos incluir um novo projeto onde teremos o Web Service em nossa solução.

No menu File clique em Add -> New Project e selecione Visual C# -> Web -> ASP .NET Web Application(.NET Framework), informe o nome CrudWebService, o local e clique em OK;

Selecione Empty e Web Forms , sem autenticação e clique em OK:

Ao final teremos uma solução contendo dois projetos:

Incluindo a referência ao Dapper e definindo o modelo de domínio e a string de conexão

Vamos incluir a referência à biblioteca Dapper em nosso projeto via Nuget.

No menu Tools clique em Nuget Package Manager e a seguir em Manage Nuget Packages for Solution;

A seguir informe dapper e clique em Browse;

Selecione o pacote encontrado, marque o projeto onde deseja instalar, e clique no botão Install; ( ( versão do Dapper v1.50.2)

Após isso vamos definir o nosso modelo de domínio. Para isso crie o arquivo Funcionario.cs na pasta Models do projeto e defina a classe Funcionario. O código segue abaixo:

    public class Funcionario
    {
        public int FuncionarioID { get; set; }
        public string Nome { get; set; }
        public string Email { get; set; }
        public string Telefone { get; set; }
        public string Endereco { get; set; }
        public string Cargo { get; set; }
        public string ImagemUrl { get; set; }
   }

A seguir abra o arquivo Web.Config e inclua a string de conexão com o banco de dados SQL Server conforme abaixo:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.6"/>
    <httpRuntime targetFramework="4.6"/>
  </system.web>
      .....
<connectionStrings>
  <add name="ConexaoSqlServer" connectionString="Data Source=.\;Initial Catalog=Cadastro;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>

Criando o Web Service e definindo os métodos CRUD

Com o projeto CrudWebService selecionado, no menu Project clique em Add New Item;

Selecione o template Web Service (ASMX), informe o nome FuncionarioService.asmx e clique em Add;

Será criado o arquivo FuncionarioService.asmx no projeto onde iremos implementar os métodos CRUD usando o Dapper. Vamos ao trabalho...

Abra o arquivo FuncionarioService.asmx e inclua os seguintes namespaces :

using Dapper;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web.Services;

A seguir defina os seguintes métodos:

1- Metodo Inserir() - Inclui um novo funcionário no banco de dados

       [WebMethod]
        public int Inserir(Funcionario ofunci)
        {
            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
            {
                if (db.State == ConnectionState.Closed)
                {
                    db.Open();
                }               
                DynamicParameters p = new DynamicParameters();
                p.Add("@FuncionarioID", dbType: DbType.Int32, direction: ParameterDirection.Output);
                p.AddDynamicParams(new { Nome = ofunci.Nome, Email = ofunci.Email, Endereco = ofunci.Endereco, Telefone = ofunci.Telefone, Cargo = ofunci.Cargo, ImagemUrl = ofunci.ImagemUrl });
                int resultado = db.Execute("sp_Funcionarios_Inserir", p, commandType: CommandType.StoredProcedure);
                if (resultado!=0)
                    return p.Get<int>("@FuncionarioID");
                return 0;
            }
        }

O código obtém a string de conexão do arquivo web.config, abre a conexão e define os parâmetros a serem usados com a stored procedure sp_Funcionarios_Inserir e a executa incluindo o funcionário na tabela.

Note que usamos o atributo WebMethod no método Publico para indicar que você deseja que o método seja exposto como parte do Web Service XML. Você também pode usar as propriedades deste atributo para configurar o comportamento do método do Web Service. As propriedades disponíveis são : BufferResponse, CacheDuration, Description, EnableSession, MessageName e TransactionOption.

2- Metodo Update()

        [WebMethod]
        public bool Update(Funcionario ofunci)
        {
            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
            {
                if (db.State == ConnectionState.Closed)
                {
                    db.Open();
                }
                int resultado = db.Execute("sp_Funcionarios_Atualizar", new { FuncionarioID = ofunci.FuncionarioID, Nome = ofunci.Nome, 
                                                        Email = ofunci.Email, Endereco = ofunci.Endereco, Telefone = ofunci.Telefone, Cargo = ofunci.Cargo, 
                                                        ImagemUrl = ofunci.ImagemUrl }, commandType: CommandType.StoredProcedure);
                return resultado != 0;
            }
        }

 

No método Update() usamos a stored procedure sp_Funcionarios_Atualizar para atualizar os dados de um funcionário.

3- Metodo GetAll()

        [WebMethod]
        public List<Funcionario> GetAll()
        {
            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
            {
                if (db.State == ConnectionState.Closed)
                {
                    db.Open();
                }
                return db.Query<Funcionario>("Select * from Funcionarios", commandType: CommandType.Text).ToList();
            }
        }

No método GetAll() retorna todos os funcionários usando a instrução SQL - Select * from.

4- Metodo Delete()

        [WebMethod]
        public bool Delete(int funciID)
        {
            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSqlServer"].ConnectionString))
            {
                if (db.State == ConnectionState.Closed)
                {
                    db.Open();
                }
                int resultado = db.Execute("delete from Funcionarios where FuncionarioID= @FuncionarioID", new { FuncionarioID = funciID }, commandType: CommandType.Text);
                return resultado != 0;
            }
        }

O método Delete() usa a instrução SQL - Delete from - para excluir um funcionário pelo seu ID.

Dessa forma implementamos os métodos CRUD em nosso web service para realizar a manutenção de dados no SQL Server.

Executando e testando o Web Service e obtendo o EndPoint

Com o nosso web service pronto vamos executá-lo e testar para ver se os métodos estão funcionando. Vamos também obter o EndPoint do nosso web service, que á o seu endereço URI de atendimento para podermos referenciar esse endereço no projeto Windows Forms para consumir o web service.

No menu Build clique em Rebuild Solution e verifique se não existem erros.

A seguir clique com o botão direito do mouse sobre o arquivo FuncinariosWebService.asmx e no menu suspenso escolha: Set As Start Page.

Depois clique com o botão direito do mouse sobre o arquivo FuncinariosWebService.asmx e no menu suspenso clique em View in Browser:

Veremos no navegador a exibição da página do nosso serviço atendendo no endereço :  localhost:331/FuncionariosService.aspmx, conforme abaixo, exibindo os métodos implementados:

Para testar o método GetAll() clique no link na página. Fazendo isso teremos o seguinte resultado:

Clicando no botão Chamar que  usa o protocolo HTTP POST iremos obter todos os funcionários atualmente cadastrados na tabela Funcionarios do banco de dados Cadastro:

Podemos repetir o procedimento para os demais métodos e ao final teremos que o nosso web service esta funcionando e pronto para ser consumido pela nossa aplicação Window Forms.

Na próxima parte do artigo iremos definir a interface com o usuário no projeto Windows Forms.

Está alguém entre vós aflito? Ore. Está alguém contente? Cante louvores. Tiago 5:13

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti