Neste artigo vamos criar uma aplicação Windows Forms onde implementaremos 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
- Visual Studio 2017 Community
- Dapper
- WebService
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:
CRUD_Dapper – projeto Windows Forms usando a interface MetroFramework que vai consumir o WebService;
CrudWebService – projeto Web onde temos o Web Service que implementa as operações CRUD no SQL Server usando o Dapper;
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:
Em seguida, 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.
Em seguida, 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 Funcionários 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.