Utilizando SGBD FireBird 2.0 com ADO.NET – Parte II

Continuando com o artigo sobre ADO.NET e SGBD FireBird 2.0, vamos então criar um novo projeto para podermos testar a conexão criada (ver 1ª parte do artigo) e os comandos SQL.

Utilizando SGBD FireBird 2.0 com ADO.NET – Parte II

 

Continuando com o artigo sobre ADO.NET e SGBD FireBird 2.0, vamos então criar um novo projeto para podermos testar a conexão criada (ver 1ª parte do artigo) e os comandos SQL.

No Visual Studio 2005, clique em File - New - Project. Será aberta a janela de New Project, clique em Visual C# - Windows. Na parte de Templates clique em Windows Application e escolha o nome do seu projeto. No nosso caso, o nome escolhido foi Comunicacao_Banco.

Crie novamente a referência do provider FireBird para esse novo projeto, conforme orientações acima

Crie um formulário conforme a imagem da Figura 5:



Figura 5 - Layout.


Teste a aplicação clicando em Debug - Start Debugging ou apertando a tecla F5.

Após ter testado nosso novo projeto, temos que adicionar a DLL criada ao nosso projeto.

No Solution Explorer, clique com o botão direito do mouse no nome do nosso projeto, Comunicacao_Banco, na aba Browse, conforme Figura 6.



Figura 6 - Add Reference.


Clique em Examinar, e procure pela classe_conexao.dll, na pasta do nosso projeto criado anteriormente.

Clique no botão OK para incluir a DLL ao nosso projeto.

Pronto, agora podemos trabalhar com o acesso a dados através do ADO.NET e com o SGBD FireBird 2.0.

Após a criação do formulário conforme a Figura 1, vá até o código fonte do seu projeto e coloque os seguintes namespaces:

 

using classe_conexao;
using FirebirdSql.Data.FirebirdClient;

 

para poder trabalhar com a DLL que nos criamos e o provider do FireBird.

Para esse projeto, criei algumas variáveis conforme abaixo:

 

       //caminho para o banco de dados
       private string caminho;


       //string com os dados para conexão
       private string strConexao;


       //objeto do tipo classe_ConexaoFB
       private classe_ConexaoFB conexao_FB;


       //objeto FbDataAdapter para poder trabalhar com SQL
       private FbDataAdapter adapt;


       //objto FbDataReader para poder trabalhar com as consultas
       private FbDataReader reader;

 

Criei também um método inicialize() para poder inicializar minhas variáveis.

 

       ///
       /// Inicializa os dados
       ///
       private void inicialize()
       {
              this.caminho = @"D:\Artigo\Codigo Fonte\Banco\" +
                         "BANCOFB.FDB";


             this.strConexao = "User=SYSDBA;" +
                            "Password=masterkey;" +
                            "DataBase=" + caminho + ";Dialect=3";


             this.reader = null;
             this.adapt = new FbDataAdapter();
             this.conexao_FB = new classe_ConexaoFB();
       }

 

Uma observação para as variáveis this.caminho e this.strConexao, pois são elas as responsáveis para a conexão com o banco de dados, onde: this.caminho esta recebendo a string com o caminho para o banco de dados e this.strConexao recebe os dados necessário para fazer a conexão com o banco, como usuário e senha, qual o banco de dados, que no caso esta em this.caminho e o dialeto do banco.

Mude as informações do caminho e usuário e senha conforme necessário.

No botão Cadastrar, de dois clique em cima dele, e informe o código conforme abaixo:

 

//
// Cadastra o cliente no banco de dados
// 

private void bt_cadastrar_Click(object sender, EventArgs e)
{


  //cria uma string com o comando SQL para inserir os dados
  string sql_Insert = "insert into tb_cliente values( " +
                      "@codigo, @nome_cliente, @fone_cliente, 

                       @cel_cliente)";         


   //tenta fazer o insert no banco
   try

   {
       //abre a conexão com o banco de dados
       this.conexao_FB.abre_Conexao();


      //cria uma nova instancia para FbDataAdapter passando como
      //parâmetos a string com o comando SQL e a conexão com o banco de dados
       this.adapt = new FbDataAdapter(sql_Insert,

                                      this.conexao_FB.get_Conexao());


       //limpa os parâmetros caso exista
       this.adapt.SelectCommand.Parameters.Clear();


     // informa para o FbDataAdapter quais são os conteudos de cada
     // parâmetro
     // obs: o código esta como null devido que o banco de dados
     //está configurado para auto incremento


    this.adapt.SelectCommand.Parameters.Add("@codigo", null);
    this.adapt.SelectCommand.Parameters.Add("@nome_cliente",

                                            tx_nome_cliente.Text);
    this.adapt.SelectCommand.Parameters.Add("@fone_cliente",

                                            tx_fone_cliente.Text);
    this.adapt.SelectCommand.Parameters.Add("@cel_cliente",

                                            tx_celular_cliente.Text);


    // executa o FbDataAdapter com o comando ExecuteNonQuery

    this.adapt.SelectCommand.ExecuteNonQuery();

 

    //mensagem para cadastro OK
    MessageBox.Show("Cadastro ok", "Atenção", MessageBoxButtons.OK,

                    MessageBoxIcon.Information);            


  }
  // caso de algum erro
  catch (Exception er)
  {
       // mensagem de erro
       MessageBox.Show("Erro ao fazer inclusão: " + er.Message, "Atenção",

                       MessageBoxButtons.OK, MessageBoxIcon.Error);
  }


  //fecha a conexao com o banco de dados
  finally
  {
        this.conexao_FB.fecha_Conexao();
  }
}

 

Uma observação sobre o comando this.adapt.SelectCommand.Parameters.Add(), a forma como foi apresentada é apenas uma das maneiras de se utilizar esse comando para fazer uma comunicação com o banco de dados, existem várias outras formas como o exemplo abaixo:

 

this.adapt.SelectCommand.Parameters.Add("@codigo", FbDbType.Integer);
this.adapt.SelectCommand.Parameters[0].Value = null;

 

Dessa forma, você está informando que o parâmetro "@codigo", é do tipo Integer. Na segunda linha é informado que na possição 0 do, digamos assim, “array de parametros”, o valor é null.

Bom, agora que já temos como cadastrar os dados no banco, podemos partir para a parte de Atualização dos Dados.
Para não estender muito, vamos fazer uma atualização de acordo com o Nome do Cliente.

No botão Atualizar, de dois clique, e informe o código conforme abaixo:

 

///
/// Atualiza os dados do Cliente
///  A atualização será feita através do nome do cliente
///
private void bt_atualizar_Click(object sender, EventArgs e)
{


      string sql_Update = "update tb_cliente set " +
            "nome_cliente = @nome, fone_cliente = @fone,

                 celular_cliente = @cel " + "where nome_cliente = @nome";


      //tenta fazer o insert no banco
      try

      {


          //abre a conexão com o banco de dados
          this.conexao_FB.abre_Conexao();


        //cria uma nova instancia para FbDataAdapter passando como
        //parâmetro a string com o comando SQL e a conexão com o banco de dados
         this.adapt = new FbDataAdapter(sql_Update,

                                        this.conexao_FB.get_Conexao());


         //limpa os parâmetros caso exista algum
         this.adapt.SelectCommand.Parameters.Clear();


         // informa para o FbDataAdapter quais são os conteudos de cada

         // parâmetro
         this.adapt.SelectCommand.Parameters.Add("@nome", tx_nome_cliente.Text);
         this.adapt.SelectCommand.Parameters.Add("@fone", tx_fone_cliente.Text);
         this.adapt.SelectCommand.Parameters.Add("@cel",

                                             tx_celular_cliente.Text);         


         // executa o FbDataAdapter com o comando ExecuteNonQuery e retorna o

         // total  de linhas afetadas
         int numero = this.adapt.SelectCommand.ExecuteNonQuery();


         //mensagem
         MessageBox.Show("Atualização ok: " + numero.ToString(), "Atenção",

                    MessageBoxButtons.OK,   MessageBoxIcon.Information);


      }


      // caso de algum erro
      catch (Exception er)
      {


            // mensagem de erro


            MessageBox.Show("Erro ao fazer atualização: " + er.Message,

                            "Atenção",
            MessageBoxButtons.OK, MessageBoxIcon.Error);


      }
      //fecha a conexão com o banco de dados
      finally

      {
           this.conexao_FB.fecha_Conexao();
      }
}

 

Não existe muita diferença dos comando de inserir para o atualizar. E novamente repetido que existem outras formas de se fazer essa comunicação com o banco, e que o exemplo da outra forma citado acima, também vale para essa atualização, bastando fazer os ajustes necessários.

No botão Deletar, de dois clique, e informe o código conforme abaixo:

 

///
/// Exclui Cliente
///  Exclui um cliente conforme o nome informado
///
private void bt_deletar_Click(object sender, EventArgs e)
{
    string sql_Delete = "delete from tb_cliente where nome_cliente = @nome";


    //tenta fazer o insert no banco
    try
    {
         //abre a conexão com o banco de dados
         this.conexao_FB.abre_Conexao();


         //cria uma nova instancia para FbDataAdapter passando como
        //parâmetro a string com o comando SQL e a conexão com o banco de dados
         this.adapt = new FbDataAdapter(sql_Delete,

                                        this.conexao_FB.get_Conexao());


         //limpa os parâmetros caso exista algum
         this.adapt.SelectCommand.Parameters.Clear();


         // informa para o FbDataAdapter quais são os conteudos de cada

         // parâmetro
         this.adapt.SelectCommand.Parameters.Add("@nome", tx_nome_cliente.Text


         // executa o FbDataAdapter com o comando ExecuteNonQuery e retorna o

         // total de  linhas afetadas
         int numero = this.adapt.SelectCommand.ExecuteNonQuery();


       //mensagem
       MessageBox.Show("Clientes Excluídos: " + numero.ToString(), "Atenção",

                       MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    // caso de algum erro
    catch (Exception er)
    {
          // mensagem de erro
          MessageBox.Show("Erro ao fazer exclusão: " + er.Message, "Atenção",
                       MessageBoxButtons.OK, MessageBoxIcon.Error);
    }


    //fecha a conexao com o banco de dados

    finally
    {
         this.conexao_FB.fecha_Conexao();
    }
}

 

Novamente a mesma observação feita para a Inserção e Atualização.

Agora, após ter cadastrado, atualizado e apagado um cliente, podemos partir para a consulta de clientes.

Nessa parte será introduzido o objeto DataReader, conforme explicado nos tópicos anteriores, é nele que ficará os resultados da consulta.

A consulta será feita também pelo nome do cliente, usando a clausula Like do SQL.

No botão Consultar, de dois clique, e informe o código conforme abaixo:


///
/// Realiza a busca pelos dados do cliente
/// através do nome
///

private void bt_consultar_Click(object sender, EventArgs e)
{


    string sql_Select = "select nome_cliente, fone_cliente, celular_cliente " +
                         "from tb_cliente " +
                          "where nome_cliente like @nome";


    //tenta fazer o insert no banco
    try
    {
        //abre a conexão com o banco de dados
        this.conexao_FB.abre_Conexao();


       //cria uma novo instancia pra FbDataAdapter passando como
       //parâmetro a string com o comando SQL e a conexão com o banco de dados
       this.adapt = new FbDataAdapter(sql_Select,

                                      this.conexao_FB.get_Conexao());


       //limpa os parâmetros caso exista algum
       this.adapt.SelectCommand.Parameters.Clear();


       // informa para o FbDataAdapter quais são os conteudos de cada

       // parâmetro     
       this.adapt.SelectCommand.Parameters.Add("@nome", "%" +

                                               tx_nome_cliente.Text + "%" );


       // executa o FbDataAdapter com o comando ExecuteReader e  retorna os

       // dados para dentro do FbDataReader
       this.reader = this.adapt.SelectCommand.ExecuteReader();


       //realiza a leitura dos dados
       while (this.reader.Read())
       {
            tx_nome_cliente.Text    = this.reader[0].ToString();


            tx_fone_cliente.Text = this.reader[1].ToString();


            tx_celular_cliente.Text = this.reader[2].ToString();
       }

       //Importante: sempre feche o FbDataReader após fazer leituras
       this.reader.Close();
    }
    // caso de algum erro
    catch (Exception er)
    {
          // mensagem de erro
          MessageBox.Show("Erro ao fazer leitura dos dados: " + er.Message,

                     "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    //fecha a conexao com o banco de dados
    finally
    {
         this.conexao_FB.fecha_Conexao();
    }
}

 

Caso seja uma consulta que irá retornar apenas um dado, como por exemplo o nome do cliente, aconselho utilizar ExecuteScalar, pois é mais rápido do que um ExecuteReader.

Para se realizar uma consulta que retorne mais de um dado, deve-se utilizar ExecuteReader conforme o código acima.

Para realizar a leitura dos dados, utilizo o comando que todo programador conhece, WHILE, que enquanto tiver dados dentro do this.reader, ele continuará passando as informações para os campos. Mas observe que, da forma que foi feito, caso exista mais de um cliente com o mesmo nome, os dados serão sobrepostos.

Deve-se tomar muito cuidado ao utilziar esse componente, pois caso você não o feche, irá ocorrer um erro, então, sempre que utilizar, feche com o comando this.reader.Close().

Conforme demostrei acima, temos várias formas para interagir com os dados dentro de um banco.

Os exemplos são apenas para mostrar uma das maneiras de utilização dos comandos, e nesse caso, não nos importamos com a regra de negócios e nem a validação dos campos.

Um exemplo adicional
Irei demonstrar agora, de forma rápida, como podemos trabalhar com um componente DataGridView, mas lembrando que é apenas um exemplo rápido, para poder saber como iniciar um trabalho com esse componente.

Acrescentei ao formulário um componente DataGridView, e dei o nome de dg_dados, acrescentei também um botão para que assim que for clicado, ira carregar o DataGridView com os dados da consulta.



Figura 7 - Layout 2.


Veja:


///
/// Carrega os dados no DataGridView
///
private void bt_dataSet_Click(object sender, EventArgs e)
{

   //cria um DataTable para carregar os dados da consulta
   DataTable dataTable = new DataTable();


   string sql_Select = "select * " +
                       "from tb_cliente "; 


   //tenta fazer o insert no banco
   try
   {
        //abre a conexão com o banco de dados
        this.conexao_FB.abre_Conexao();


        //cria uma nova instancia pra FbDataAdapter passando como
       //parâmetro a string com o comando SQL e a conexão com o banco de
       //dados
        this.adapt = new

                     FbDataAdapter(sql_Select,this.conexao_FB.get_Conexao());


        //limpa os parâmetros caso exista algum
        this.adapt.SelectCommand.Parameters.Clear();


        //executa a consulta
        this.adapt.SelectCommand.ExecuteNonQuery();


        //preenche o dataTable com os dados da consulta
        this.adapt.Fill(dataTable);      


        // preenche o DataGridView com os dados
        this.dg_dados.DataSource = dataTable;
   }
   // caso de algum erro
   catch (Exception er)

 {
        // mensagem de erro
        MessageBox.Show("Erro ao fazer leitura dos dados: " + er.Message,

                   "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }

   //fecha a conexao com o banco de dados
   finally
   {
          this.conexao_FB.fecha_Conexao();
   }
}

 

Conclusão
Chegamos então ao final desse Artigo sobre Utilização do SGBD FireBird 2.0 com o ADO.NET, onde podemos ver de forma básica, como fazer para comunicar e trocar informações com o banco de dados, além de conhecer um pouco da parte teórica, que é muito importante para o desenvolvimento correto de uma aplicação.

Referências
http://www.linhadecodigo.com.br/artigos.asp?id_ac=435=0

http://www.linhadecodigo.com.br/artigos.asp?id_ac=216

http://linhadecodigo.com.br/artigos.asp?id_ac=1254&pag=1

http://www.microsoft.com/brasil/msdn/adonet/default.mspx

http://msdn2.microsoft.com/pt-br/default.aspx

http://www.macoratti.net/vbn_fb2.htm

 

Artigos relacionados