DataARTIGO

EF Core – Copiando dados de um ListBox para o SQL Server

Neste artigo, José Carlos Macoratti mostra como copiar dados selecionados de um ListBox para um banco de dados SQL Server usando o EF Core e C#.

Neste artigo veremos como copiar os dados selecionados de um ListBox para um banco de dados SQL Server usando o EF Core e a linguagem C#.

Vamos supor que você tenha um banco de dados SQL Server chamado Cadastro e uma tabela Clientes com os seguintes dados:

Em uma aplicação Windows Forms você possui um formulário onde um controle ListBox exibe os dados carregados de uma fonte de dados. Essa fonte de dados pode ser um banco de dados, um arquivo de texto, um arquivo XML, etc.

Você deseja selecionar um item da ListBox, exibir os seus detalhes no formulário e salvar o item selecionando na tabela Clientes. Mas como fazer isso?

Para fazer isso, podemos usar diversas abordagens, e neste artigo eu vou usar o Entity Framework Core 2.1 para realizar essa tarefa.

Então, mãos à obra!

Criando o projeto Windows Forms no VS 2017 Community

Abra o VS 2017 Community e crie um novo projeto do tipo Windows Forms usando o .NET Framework 4.6.2 com o nome de CShp_ListboxDB.

Nota: Para poder usar o EF Core com o .NET Framework, você tem que usar a versão 4.6.1 ou superior.

Agora vamos incluir uma referência ao Entity Framework Core para acessar o SQL Server: Microsoft.EntityFrameworkCore.SqlServer.

Acesse via menu Tools > Nuget Package Manager > Manage Nuget Packages for Solution, clique na guia Browse, selecione o pacote e instale no projeto:

A seguir, a partir da Toolbox inclua os seguintes controles no formulário Form1.cs:

  • 1 ListBox: lbDados
  • 4 TextBox: txtNome, txtEmail, txtPais e txtIdade
  • 3 Buttons: btnCarregar, btnSalvar e btnSair

Disponha os controles conforme o layout da figura abaixo:

Definindo a string de conexão no arquivo App.Config

Vamos armazenar a informação da string de conexão com o banco de dados Cadastro, que desejamos acessar no arquivo App.Config.

Abra o arquivo e inclua o código abaixo:

...
 <connectionStrings>
<add name="conexaoSQL" connectionString="Data Source=MACORATTI;Initial  Catalog=Cadastro;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
,,,

Aproveitando, vamos incluir uma referência ao namespace System.Configuration ao projeto via menu Project > Add Reference.

Precisamos desta referência para acessar a string de conexão no arquivo App.Config.

Criando o modelo de entidades, a classe de contexto e o Serviço

Crie uma pasta chamada Model no projeto e nesta pasta crie a classe Cliente com o seguinte código:

    public class Cliente
    {
        public int ClienteId { get; set; }
        public string Nome { get; set; }
        public string Email { get; set; }
        public int Idade { get; set; }
        public string Pais { get; set; }
        public override string ToString() => $"{Nome} - {Email}".Trim();
    }

A seguir, crie a classe AppDbContext com o código abaixo:

using Microsoft.EntityFrameworkCore;
using System.Configuration;   
 public class AppDbContext : DbContext
    {
        public DbSet<Cliente> Clientes { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["ConexaoSQL"].ConnectionString);
        }
    }

Crie outra pasta chamada Service no projeto e a crie a classe ClienteService com o código mostrado abaixo:

using CShp_ListboxDB.Model;
using System.Collections.Generic;
namespace CShp_ListboxDB.Service
{
    public class ClienteService
    {
        public static List<Cliente> GetClientes()
        {
            var listaClientes = new List<Cliente>()
            {
                new Cliente {Nome="Jose Carlos Sá ", Pais="Brasil", Email= "macoratti@yahoo.com", Idade=31},
                new Cliente {Nome="Miriam Batucada", Pais="Brasil", Email= "mimi@hotmail.com", Idade=21},
                new Cliente {Nome="Jefferson Airplane", Pais="Brasil", Email= "jefferson@hotmail.com", Idade=25},
                new Cliente {Nome="Bianca Barraco", Pais="Brasil", Email= "bianca@hotmail.com", Idade=20},
                new Cliente {Nome="Marcia Uber", Pais="Brasil", Email= "marcia@hotmail.com", Idade=25},
                new Cliente {Nome="Janice Sampa", Pais="Brasil", Email= "janice@hotmail.com", Idade=23},
                new Cliente {Nome="Luzia Alegria", Pais="Brasil", Email= "luzia@hotmail.com", Idade=38}
            };
            return listaClientes;
        }
    }
}

Este serviço vai fornecer os dados que vamos exibir no ListBox. Aqui você pode alterar o código para obter os dados de outras fontes.

Definindo o código do formulário

Vamos declarar no início do formulário Fom1.cs uma variável para receber o cliente selecionado:

  • Cliente clienteSelecionado;

No evento Click do botão Carregar Dados, temos o código que vai preencher o listbox com dados do serviço:

   private void btnCarregar_Click(object sender, EventArgs e)
   {
            try
            {
                ExibirClientes();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro " + ex.Message);
            }
   }

Abaixo temos o código do método ExibirClientes() que vai usar o serviço e exibir os dados no ListBox:

       private void ExibirClientes()
        {
            try
            {
                lbDados.Items.Clear();
                var clientes = ClienteService.GetClientes();
                foreach (var cliente in clientes)
                      lbDados.Items.Add(cliente);
            }
            catch (Exception)
            {
                throw;
            }
        }

No evento SelectedIndexChanged do ListBox temos o código para obter os dados do cliente selecionado iremos exibí-los nos TextBox do formulário:

 private void lbDados_SelectedIndexChanged(object sender, EventArgs e)
 {
            clienteSelecionado = (Cliente)lbDados.SelectedItem;
            txtNome.Text = clienteSelecionado.Nome;
            txtEmail.Text = clienteSelecionado.Email;
            txtPais.Text = clienteSelecionado.Pais;
            txtIdade.Text = clienteSelecionado.Idade.ToString();
 }

Finalmente, no evento Click do botão Salvar Dado Selecionado, temos o código que cria uma instância do contexto e usa o método Add para incluir a entidade selecionada no contexto, e a seguir, usando o método SaveChanges() para persistir as informações do banco de dados:

private void btnSalvar_Click(object sender, EventArgs e)
{
            if (MessageBox.Show("Deseja salvar este cliente ?","Salvar Cliente", MessageBoxButtons.YesNo ) == 
DialogResult.Yes)
            {
                using (var contexto = new AppDbContext())
                {
                    contexto.Add(clienteSelecionado);
                    contexto.SaveChanges();
                }
            }
}

Executando o projeto iremos obter o seguinte resultado:

Inicialmente temos o formulário principal. Após clicar no botão Carregar Dados, vemos o ListBox exibir os dados selecionados.

Selecionando um item do ListBox vemos as informações exibidas nos TextBox do formulário e ao clicar no botão Salvar Dado Selecionado, o cliente selecionado será persistido na tabela Clientes.

Abrindo o SQL Server Management Studio e verificando a tabela Clientes, vemos os dados do cliente selecionado na tabela conforme mostra a figura abaixo:

Assim, usando o EF Core fica muito fácil persistir informações em um banco de dados relacional como o SQL Server.

Pegue o projeto completo aqui: CShp_ListboxDB.zip.

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil