C# - Criando um projeto de Acesso a Dados - 4


Se você esta chegando agora ou já vem acompanhando esta série de artigos preste atenção no histórico do que já foi feito até aqui:

1-  SharpDevelop - Criando um projeto de Acesso a Dados - Criamos um projeto usando C# e SharpDevelop com acesso a dados onde apenas fazíamos a seleção dos dados e exibíamos em um datagridview; (O projeto pode ser aberto também no Visual C# Express Edition)

2-  SharpDevelop - Criando um projeto de Acesso a Dados - 2 - Estendemos o projeto inicial e adicionamos a possibilidade de incluir novos dados usando o SharpDevelop. (O projeto pode ser aberto também no Visual C# Express Edition)

3-  SharpDevelop - Criando um projeto de Acesso a Dados - 3 -  Ainda usando o SharpDevelo,p mostramos como usar consultas parametrizadas para incluir dados.(O projeto pode ser aberto também no Visual C# Express Edition)

E agora o que vamos fazer ?

A partir deste artigo eu vou passar a usar o Visual C# Express Edition ao invés do SharpDevelop. (Ele também e grátis e tb é fácil de usar.)

Por que eu vou fazer isso ?

Apenas para mostrar como usar o Visual C#  e porque eu ainda não o usei; mas poderíamos perfeitamente continuar a usar o SharpDevelop e, se você quiser , pode também abrir o projeto no SharpDevelop.

Eu vou vou implementar na aplicação todas operações CRUD (Create, Update, Delete) que estão faltando:

De forma que ao final você vai ter uma aplicação simples acessando um banco de dados Access com as funcionalidades para incluir, alterar, excluir e procurar dados, ou seja, uma aplicação C# completa com acesso a dados com as principais operações básicas.

Assim, você não vai poder mais reclamar.

Abra então o Visual C# Express Edition (se não tiver faça o download em:   http://www.microsoft.com/express/download ) e abra o projeto com o qual já estávamos trabalhando. (c_AcessoBD.zip)

Abra o formulário form1.cs e inclua 3 botões de comando logo abaixo do datagridview;

A seguir no menu Project selecione a opção Add Windwos Forms e inclua um formulário windows , form3.cs, que será usado para alterar dados;

Repita o processo e inclua mais 2 formulários windows a saber: form4.cs  para excluir dados e form5.cs para procurar dados e altere o título de cada um deles conforme a funcionalidade para qual será usado definindo também a propriedade StartPosition igual a CenterScreen.

Alterando dados com C#

Vamos agora implementar a funcionalidade para alterar dados usando C# com Visual C# Express Edition.

Abra o formulário form3.cs e inclua 7 controles TextBox e 7 Controles Labels e dois controles Button conforme o leiaute abaixo:

Temos os seguintes controles inseridos neste formulário:

- 7 controles Labels
- 7 controles TextBox :

  • txtCodigo , TabStop = False , ReadOnly = True
  • txtNome
  • txtEndereco
  • txtCidade
  • txtEstado
  • txtCep
  • txtTelefone

- 2 controles Button

  • btnAlterar
  • btnCancelar

Defina também no inicio do formulário as seguintes variáveis correspondentes aos campos da tabela Clientes:

public string nome, endereco, cidade, estado, cep, telefone;
public string codigoID;

Não esqueça de incluir o namespace :  using System.Data.OleDb;

No Evento Load do formulário inclua o código abaixo que irá preencher os controles no formulário com os dados:

private void Form3_Load(object sender, EventArgs e)

{

txtCodigo.Text = codigoID;

txtNome.Text = nome;

txtEndereco.Text = endereco;

txtCidade.Text = cidade;

txtEstado.Text = estado;

txtCep.Text = cep;

txtTelefone.Text = telefone;

}

 

No evento Click do botão Alterar digite o código a seguir:

private void btnAlterar_Click(object sender, EventArgs e)

{

if (validaDados())

    AlterarDados();

else

    MessageBox.Show("Dados Inv lidos...");

    txtNome.Focus();

return;

}

A rotina validaDados irá verificar se os dados informados são válidos , e , seu código é dado a seguir:

private Boolean validaDados()

{

   if (txtNome.Text == string.Empty)

      return false;
 

   if (txtEndereco.Text == string.Empty)

      return false;

 

    if (txtCidade.Text == string.Empty)

      return false;

 

    if (txtEstado.Text == string.Empty)

      return false;

 

    if (txtCep.Text == string.Empty)

       return false;

 

    return true;

}

A rotina AlterarDados() é quem realmente irá efetivar as alterações na tabela Clientes:

private void AlterarDados()

{


//define string de conexÆo - Provedor + fonte de dados (caminho do banco de dados e seu nome)

string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";


//define a instru‡Æo SQL para atualizar os dados da tabela Clientes - UPDATE tabela SET campos

string strSQL = "UPDATE Clientes SET nome ='" + txtNome.Text.Replace("'", "''") + "', endereco='" + txtEndereco.Text + "', _
                      cidade='"
+ txtCidade.Text + "', estado='" + txtEstado.Text + "', cep='" + txtCep.Text + "', telefone='" + _
                      txtTelefone.Text + "' WHERE codigo=" + int.Parse(codigoID) + "";

 

//cria a conexÆo com o banco de dados

OleDbConnection dbConnection = new OleDbConnection(strConnection);


//Cria o comando que inicia a instru‡Æo SQL para altera‡Æo

OleDbCommand cmdAlterar = new OleDbCommand(strSQL, dbConnection);

try

{

// abre o banco de dados

dbConnection.Open();

// executa a instru‡Æo SQL

cmdAlterar.ExecuteNonQuery();

//

MessageBox.Show("Dados Alterados com sucesso.");

}

//Trata a exce‡Æo

catch (OleDbException ex)

{

MessageBox.Show("Error: " + ex.Message);

}

finally

{

//fecha a conexao

dbConnection.Close();

}

}

Cabe destacar no código acima a instrução SQL para atualizar os dados:

"UPDATE Clientes SET nome ='" + txtNome.Text.Replace("'", "''") + "', endereco='" + txtEndereco.Text + "', _
cidade='"
+ txtCidade.Text + "', estado='" + txtEstado.Text + "', cep='" + txtCep.Text + "', telefone='" + _
txtTelefone.Text + "' WHERE codigo=" + int.Parse(codigoID) + "";

Note que estou usando o método Replace no nome informado para substituir aspas simples (') por aspas duplas(''). O objetivo é evitar problemas com nomes que usam apóstrofe.

Agora feche o formulário form3.cs e abra o formulário form1.cs, clique duas vezes sobre o botão - Alterar e inclua o seguinte código no seu evento Click:

private void btnAlterar_Click(object sender, EventArgs e)

{

 

  try

  {

   //obtem o c¢digo do cliente a partir da linha selecionada no datagridview

   codigoID = dgvDados[0, linhaAtual].Value.ToString();

  }

  catch (Exception ex)

  {

   MessageBox.Show("Erro..." + ex.Message);

  }

 

  if (linhaAtual >= 0)

  {

    //obtem dados do datagridview e atribui as vari veis definidas no formulario f3

    obtemDadosGrid();


    Form3
f3 = new Form3();

    //

    f3.codigoID = codigoID;

    f3.nome = nome;

    f3.endereco = endereco;

    f3.cidade = cidade;

    f3.estado = estado;

    f3.cep = cep;

    f3.telefone = telefone;

    //exibe o formul rio para altera‡Æo

    f3.ShowDialog();

    //atualiza o grid e reexibe os dados

    dgvDados.Update();

    iniciaAcesso();

  }

}

O código acima irá obter o código do cliente a partir da linha selecionada e preencher com os dados da linha as variáveis que definimos no formulário form3.cs abrindo o formulário form3.cs com os dados para alteração.

Falta mostrar ainda a rotina obtemDadosGrid() que obtém os valores de cada um dos campos a partir da linha selecionada no datagridivew usando as posições da colunas. Desta forma a coluna nome é a segunda coluna e tem o valor do índice igual a 1 , e assim por diante...

private void obtemDadosGrid()

{

   //obtém os dados do datagridview da linha selecionada usando as posi‡äes das colunas

   //a primeira coluna ‚ a coluna 0 a segunda ‚ a coluna 1 , e , assim por diante

   nome = dgvDados[1, linhaAtual].Value.ToString();

   endereco = dgvDados[2, linhaAtual].Value.ToString();

   cidade = dgvDados[3, linhaAtual].Value.ToString();

   estado = dgvDados[4, linhaAtual].Value.ToString();

   cep = dgvDados[5, linhaAtual].Value.ToString();

   telefone = dgvDados[6, linhaAtual].Value.ToString();

//

}

 

Veja abaixo um exemplo de alteração dos dados de uma linha selecionada no datagridview:

Excluindo dados com C#

Vamos agora implementar a exclusão dos dados:

Abra o formulário form4.cs e inclua 7 controles TextBox e 7 Controles Labels e dois controles Button conforme o leiaute abaixo:

Temos os seguintes controles inseridos neste formulário:

- 7 controles Labels
- 7 controles TextBox :

  • txtCodigo , TabStop = False , ReadOnly = True
  • txtNome , TabStop = False , ReadOnly = True
  • txtEndereco , TabStop = False , ReadOnly = True
  • txtCidade ,  TabStop = False , ReadOnly = True
  • txtEstado , TabStop = False , ReadOnly = True
  • txtCep , TabStop = False , ReadOnly = True
  • txtTelefone , TabStop = False , ReadOnly = True

- 2 controles Button

  • btnExcluir
  • btnCancelar

Defina também no inicio do formulário as seguintes variáveis correspondentes aos campos da tabela Clientes:

public string nome, endereco, cidade, estado, cep, telefone;
public string codigoID;

Não esqueça de incluir o namespace :  using System.Data.OleDb;

No Evento Load do formulário inclua o código abaixo que irá preencher os controles no formulário com os dados:

private void Form4_Load(object sender, EventArgs e)

{

txtCodigo.Text = codigoID;

txtNome.Text = nome;

txtEndereco.Text = endereco;

txtCidade.Text = cidade;

txtEstado.Text = estado;

txtCep.Text = cep;

txtTelefone.Text = telefone;

}

 

No evento Click do botão Excluir do formulário coloque o seguinte código:

private void btnExcluir_Click(object sender, EventArgs e)

{

//solicita‡Æo confirma‡Æo para excluir

if (MessageBox.Show("Confirma exclusÆo? ", "Excluir", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

        ExcluirDados();

}

}

A rotina ExcluirDados() é quem vai excluir os dados da tabela Clientes e possui o seguinte código:

private void ExcluirDados()

{

//define string de conexÆo - Provedor + fonte de dados (caminho do banco de dados e seu nome)

string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";

 

//define instru‡Æo SQL para excluir dados da tabela Clientes - DELETE FROM tabela Where <criterio>

string strSQL = "DELETE FROM clientes WHERE codigo=" + int.Parse(codigoID) +"";

 

//cria a conexÆo com o banco de dados

OleDbConnection dbConnection = new OleDbConnection(strConnection);

 

//Cria o comando que inicia a instru‡Æo SQL para exclusÆo

OleDbCommand cmdExcluir = new OleDbCommand(strSQL, dbConnection);

try

{

// abre o banco de dados

dbConnection.Open();

 

// executa a instru‡Æo SQL

cmdExcluir.ExecuteNonQuery();

//

MessageBox.Show("Dados Exclu¡dos com sucesso.");

}

//Trata a exce‡Æo

catch (OleDbException ex)

{

MessageBox.Show("Error: " + ex.Message);

}

finally

{

//fecha a conexao

dbConnection.Close();

}

}

Cabe destacar a instrução SQL usada para excluir os dados:   "DELETE FROM clientes WHERE codigo=" + int.Parse(codigoID) +"";

Observe que estou convertendo o parâmetro codigoID de string para int:   int.Parse(codigoID)

Feche o formulário form4.cs e abra novamente o formulário form1.cs que contém o datagridview. A seguir no evento Click do botão de comando Excluir inclua o seguinte código:

private void btnExcluir_Click(object sender, EventArgs e)

{

    try

    {

       //obtem o c¢digo do cliente a partir da linha selecionada no datagridview

       codigoID = dgvDados[0, linhaAtual].Value.ToString();

    }

    catch (Exception ex)

    {

     MessageBox.Show("Erro..." + ex.Message);

    }

 

    if (linhaAtual >= 0)

    {

      //obtem dados do datagridview e atribui as vari veis definidas no formulario f4

      obtemDadosGrid();

      Form4 f4 = new Form4();

      //

      f4.codigoID = codigoID;

      f4.nome = nome;

      f4.endereco = endereco;

      f4.cidade = cidade;

      f4.estado = estado;

      f4.cep = cep;

      f4.telefone = telefone;

      //exibe o formul rio para exclusÆo

      f4.ShowDialog();

      //atualiza o grid e reexibe os dados

      dgvDados.Update();

      iniciaAcesso();

    }

}

 

A rotina obtemDadosGrid() já foi exibida no tópico anterior.

Veja a seguir um exemplo de exclusão de dados para o cliente de código igual a 8 selecionado no datagridview.

Filtrando dados com C#

Finalmente para encerrar nossa aplicação com acesso a dados usando C# falta uma rotina para filtrar dados pois como os dados estão sendo exibidos no DataGridView a medida que a quantidade de dados cresce vai ficando cada vez mais difícil e trabalhoso selecionar uma linha para alterar e/ou excluir.

Por isso vou criar uma rotina para filtrar os dados exibidos no Datagridview conforme um critério informado pelo usuário. Isso pode ser feito de diversas formas e eu optei por executar um instrução SQL para filtrar pelo nome do cliente.  O usuário informe o nome completo ou parcial que será usado como critério para montar a instrução SQL que será executada. A estrutura do SQL usado é :

SELECT campos FROM tabela WHERE nome LIKE criterio

Abra então o formulário form5.cs e inclua um controle Label , um controle TextBox (txtNome) e dois botões de comando : Localizar(btnLocalizar) e Sair (btnFechar):

A seguir defina as seguintes variáveis no formulário:

private string criterio = "";
public string sqlString = "";

No evento Click do botão Localizar inclua o código a seguir:

private void btnLocalizar_Click(object sender, EventArgs e)

{


criterio = txtNome.Text.ToString();

 

if (criterio != "")

{

     sqlString = "SELECT * FROM Clientes Where nome LIKE '" + criterio + "%'";

     this.Close();

}

else

{

   MessageBox.Show("Informe o nome a procurar", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}

 

Este código monta a instrução SQL atribuindo-a a uma variável pública sqlString que será usada no formulário principal form1.cs para executar a instrução SQL filtrando os dados.

Feche o formulário form5.cs e abra o formulário form1.cs. No evento Click do botão Procurar digite o código a seguir:

private void btnProcurar_Click(object sender, EventArgs e)

{

Form5 f5= new Form5();
 

f5.ShowDialog();


if
(f5.sqlString != null && f5.sqlString != "")

      carregaGrid(f5.sqlString);

}

 

Este código cria uma instância do formulário form5.cs e abre-o na forma modal; em seguida verifica se a variável sqlString do formulário f5 não é vazia nem nula; neste caso executa a rotina carregaGrid() passando a instrução SQL montada.

A rotina carregaGrid() é dada abaixo:

private void carregaGrid(string criterioSQL)

{


//define o dataset

ds = new DataSet();


//cria uma conexÆo usando a string de conexÆo

Conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\dados\\" + bd);


try

{

  //abre a conexao

  Conn.Open();

}

catch (System.Exception e)

{

  MessageBox.Show(e.Message.ToString());

}
 

if (Conn.State == ConnectionState.Open)

{

   //se a conexÆo estiver aberta usa uma instru‡Æo SQL para selecionar os registros da tabela clientes

    //SELECT campos FROM tabela

   da = new OleDbDataAdapter(criterioSQL, Conn);

   da.Fill(ds, "Tabela");


   //exibe os dados no datagridview

   dgvDados.DataSource = ds;

   dgvDados.DataMember = "Tabela";

}

}

 

Esta rotina executa a instrução SQL para filtrar os dados exibindo-os no datagridview.

Veja abaixo um exemplo de filtro onde o critério informado para o nome do cliente pelo usuário foi a letra M:

Agora acabamos e podemos dizer que temos um pequeno projeto feito em C# com acesso a dados onde realizarmos as operações básicas de manutenção de dados.

Temos um projeto simples que foi feito sem a ajuda dos assistentes que funciona corretamente mas a forma como foi desenvolvido apresenta diversos problemas:

Com isso concluímos que temos que melhorar a aplicação e podemos fazer isso da seguinte forma:

Criando camadas com responsabilidades distintas e independentes uma das outras fazemos com que qualquer alteração em uma das camadas não se replique para as demais camadas e com isso temos um código mais limpo e fácil de manter.

Aguarde o próximo artigo onde irei mostrar como criar as camadas de acesso a dados(DAL) e da lógica de negócio (BLL) de forma a tornar a nossa aplicação mais robusta e com potencial para ser expandida de forma segura.

Pegue o projeto completo aqui:  c_AcessoBD_4.zip

Até o próximo artigo ...

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