C# -  Como exibir dados em um formulário ?


 Qual a melhor abordagem para exibir informações de um banco de dados em um formulário Windows Forms ?

Embora possa parecer uma pergunta simples, para quem esta iniciando agora na plataforma .NET não é tão óbvio assim saber qual a melhor forma de acessar um banco de dados e exibir as informações em um formulário.

Para procurar entender o problema vamos montar o seguinte cenário:

Você possui um projeto que possui uma classe Cliente, uma classe Banco uma classe Contas conforme mostra o diagrama de classe abaixo:

Considere a existência de um banco de dados BancoDB e das tabelas Bancos e Clientes possuindo colunas com os mesmos nomes das propriedades das classes Banco e Cliente.

Considere também que a string de conexão esta presente no arquivo App.Config na seção connectionStrings.

Em sua aplicação você tem um Windows Forms que chama um método ExibirConta() de uma classe Contas() que acessa dados em um banco de dados relacional SQL Server cujo objetivo é exibir os dados de um cliente em caixas de textos no formulário conforme mostra a figura abaixo:

Recursos usados:

  • Visual Studio 2017 Community
  • Sql Server

Para realizar essa tarefa você tem a sua disposição 3 opções que vamos descrever a seguir:

1 -  Usar o método ExibirConta() que retorna um objeto do tipo Contas com campos preenchidos com dados do banco de dados:

using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace WF_ExibirDados
{
    public class Contas
    {
        string numeroConta;
        string nomeConta;
        string nomeBanco;
        string tipoConta;
        frmDetalhesConta form = new frmDetalhesConta();
        public Contas ExibirConta(string numeroConta)
        {
            this.numeroConta = numeroConta;
            var conexaoBD =  ConfigurationManager.ConnectionStrings["BancoDB"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conexaoBD))
            {
                SqlCommand cmd = new SqlCommand("SELECT Cliente.Nome, Banco.ContaNome, Banco.BancoNome, 
                                                                                Banco.ContaTipo FROM Banco INNER JOIN Cliente ON 
                                                                                Banco.ClienteId = Cliente.ClienteId WHERE 
                                                                                (Banco.ContaNumero = @numeroConta)", con);
                cmd.Parameters.Add("@numeroConta", SqlDbType.Char).Value = numeroConta;
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                rdr.Read();
                //NomeCliente não é membro da classe Contas
                form.txtNomeCliente.Text = rdr.GetString(0); 
                this.nomeConta = rdr.GetString(1);
                this.nomeBanco = rdr.GetString(2);
                this.tipoConta = rdr.GetString(3);
                return this;
            }
        }
    }
}

Para obter os dados e preenche o formulário você usaria o evento Click do botão Enviar passando o número da conta conforme mostra o código abaixo:

         private void btnConsultar_Click(object sender, EventArgs e)
        {
            //Cria uma instancia da classe Conta
            Contas contaBancaria = new Contas();
            //Invoca o método ExibirConta passando o numero da conta
            contaBancaria = contaBancaria.ExibirConta(txtNumeroConta.Text);  
            // Obtem o valor dos campos e atribuir ao TextBox
            txtNomeBanco.Text = contaBancaria.nomeBanco;  
            txtNomeConta.Text = contaBancaria.nomeConta;
            txtTipoConta.Text = contaBancaria.tipoConta;
        }

2 - A segunda opção é retornar um objeto DataReader que será usado pelo formulário para obter os dados:

using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace WF_ExibirDados
{
    public class Contas
    {
        string numeroConta;
        string nomeConta;
        string nomeBanco;
        string tipoConta;

        public SqlDataReader ExibirConta(string numeroConta)
        {
            this.numeroConta = numeroConta;
            var conexaoBD =  ConfigurationManager.ConnectionStrings["BancoDB"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conexaoBD))
            {
                SqlCommand cmd = new SqlCommand("SELECT Cliente.Nome, Banco.ContaNome, Banco.BancoNome, 
                                                                                Banco.ContaTipo FROM Banco INNER JOIN Cliente ON 
                                                                                Banco.ClienteId = Cliente.ClienteId WHERE 
                                                                                (Banco.ContaNumero = @numeroConta)", con);
                cmd.Parameters.Add("@numeroConta", SqlDbType.Char).Value = numeroConta;
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                rdr.Read();
                return rdr;
            }
        }
    }
}

Nesta abordagem vamos obter os dados do objeto SqlDataReader:

         private void btnConsultar_Click(object sender, EventArgs e)
        {
            //Cria uma instancia da classe Conta
            Contas contaBancaria = new Contas();
            //Invoca o método ExibirConta passando o numero da conta
            SqlDataReader dr = contaBancaria.ExibirConta(txtNumeroConta.Text);
            // Obtem o valor dos campos e atribuir ao TextBox
            txtNomeBanco.Text = dr.GetString(1); 
            txtNomeConta.Text = dr.GetString(2); 
            txtTipoConta.Text = dr.GetString(3);
        }

3 - Na terceira opção você acessa os dados e os atribui diretamente aos campos do formulário no método ExibirConta():

using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace WF_ExibirDados
{
    public class Contas
    {
        string numeroConta;
        string nomeConta;
        string nomeBanco;
        string tipoConta;
        frmDetalhesConta form = new frmDetalhesConta();
        public void ExibirConta(string numeroConta)
        {
            this.numeroConta = numeroConta;
            var conexaoBD =  ConfigurationManager.ConnectionStrings["BancoDB"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conexaoBD))
            {
                SqlCommand cmd = new SqlCommand("SELECT Cliente.Nome, Banco.ContaNome, Banco.BancoNome, 
                                                                                Banco.ContaTipo FROM Banco INNER JOIN Cliente ON 
                                                                                Banco.ClienteId = Cliente.ClienteId WHERE 
                                                                                (Banco.ContaNumero = @numeroConta)", con);
                cmd.Parameters.Add("@numeroConta", SqlDbType.Char).Value = numeroConta;
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                rdr.Read();
                form.txtNomeCliente.Text = rdr[0].ToString();
	   form.txtNomeConta.Text = rdr[1].ToString();
                form.txtNomeBanco.Text = rdr[2].ToString();
                form.txtTipoConta.Text = rdr[3].ToString();                            }
        }
    }
}

Pois bem, das 3 opções elencadas acima qual seria a mais adequada para usar em sua aplicação ?

Vou responder no próximo artigo...

Pegue o projeto completo aqui :  WF_ExibirDados.zip

"Grandes são as obras do Senhor, procuradas por todos os que nelas tomam prazer."
Salmos 111:2

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti