Spread the love

Este artigo demonstrará como desenvolver um CRUD básico em C#. O CRUD é composto pelas operações básicas que uma aplicação faz em banco de dados, nesse artigo será usado o SQL Server.

      Este artigo demonstrará como desenvolver um CRUD básico. CRUD vem do inglês Create Read Update e Delete que em tradução livre para o português seria Criar, Ler, Atualizar, e Excluir. O CRUD é composto pelas operações básicas que uma aplicação faz a um banco de dados.

      O CRUD que será mostrado neste artigo foi desenvolvido de uma forma bem simples para aqueles que realmente estão começando a dar seus primeiros passos, mais que já tenham um conhecimento básico em C# e em SQL e SQL Server, como declarar variáveis e alguns comandos da sintaxe e executar instruções SQL.

      Será usado neste artigo o Visual Studio 2010, SQL Server e o SQL Server Management Studio.

      Por ser destinados a iniciantes, algumas pessoas que já tem alguma experiência poderão notar que algumas partes do código poderiam ser feitas de forma diferente, utilizando melhores práticas e reaproveitamento de código, mas o objetivo deste artigo é ensinar a aquelas que nunca fizeram um CRUD ou que possuem dúvidas de como fazer, então foi feito de maneira bem simples para que todos possam entender.

      O primeiro passo é criar o banco de dados que será utilizado. A Listagem 1 contém o código SQL para a criação do mesmo.

      /* CRIAR BANCO DE DADOS */
      CREATE DATABASE BDCADASTRO

      /* SELECIONA O BANCO DE DADOS */
      USE BDCADASTRO

      /* CRIACÇÃO DA TABELA */
      CREATE TABLE CLIENTE (
      ID INT NOT NULL IDENTITY,
      NOME VARCHAR(50) NOT NULL,
      ENDERECO VARCHAR(50),
      CEP VARCHAR(9),
      BAIRRO VARCHAR(50),
      CIDADE VARCHAR(50),
      UF VARCHAR(2),
      TELEFONE VARCHAR(15),
      CONSTRAINT PK_CLIENTE PRIMARY KEY(ID)
      )

      Listagem 1. Comandos SQL para criação do banco de dados e tabela

      Após a criação do banco de dados, crie um formulário conforme a Figura 1.

      Tela de cadastro
      Figura 1. Tela de cadastro

      Abaixo segue a Tabela 1 com todos os controles necessário para o formulário.

      Cadastro de clienteTipo: Form Name: frmCadastroCliente StartPosition: CenterScreen
      IdTipo: TextBox Name: txtId ReadOnly: True
      NomeTipo: TextBox Name: txtNome CharacterCasing: Upper MaxLength: 50
      EndereçoTipo: TextBox Name: txtEndereco CharacterCasing: Upper MaxLength: 50
      CEPTipo: MaskedTextBox Name: mskCEP Mask: 00000-999
      BairroTipo: TextBox Name: txtBairro CharacterCasing: Upper MaxLength: 50
      CidadeTipo: TextBox Name: txtCidade CharacterCasing: Upper MaxLength: 50
      UFTipo: TextBox Name: txtUf CharacterCasing: Upper MaxLength: 2
      TelefoneTipo: MaskedTextBox Name: mskTelefone Mask: (99) 0000-0000
      Barra de botõesTipo: ToolStrip Name: toolStrip1
      NovoTipo: ToolStripButton Name: tsbNovo Text: Novo
      SalvarTipo: ToolStripButton Name: tsbSalvar Text: Salvar
      CancelarTipo: ToolStripButton Name: tsbCancelar Text: Cancelar
      ExcluirTipo: ToolStripButton Name: tsbExcluir Text: Excluir
      SeparadorTipo: ToolStripSeparator Name: toolStripSeparator1
      Buscar por Id:Tipo: ToolStripLabel Name: tsbBuscaPorId Text: Buscar por Id:

      Tipo: ToolStripTextBox Name: tstId
      BuscarTipo: ToolStripButton Name: tsbBuscar Text: Buscar

      Tabela 1. Controles do formulário

      As imagens para os botões podem ser encontradas no site https://www.iconfinder.com, basta apenas procurar pelo nome.

      Após tudo isso feito é hora de programar.

      Dê dois cliques em uma área vazia do formulário, para que seja mostrado o arquivo frmCadastroCliente.cs. Nele será criado o método frmCadastroCliente_Load. Logo acima do método frmCadastroCliente_Load existe o construtor da classe que é o frmCadastroCliente e logo acima dele crie as seguintes variáveis, conforme a Listagem 2.

      string connectionString = @"Server=.\sqlexpress;Database=bdcadastro;Trusted_Connection=True;";
      bool novo;
      
      public frmCadastroCliente()
      {
          InitializeComponent();
      }
      
      private void frmCadastroCliente_Load(object sender, EventArgs e)
      {
      
      }

      Listagem 2. Criação das variáveis

      A variável connectionString armazena a string de conexão com o banco de dados e a variável novo será usada para quando salvar saber se o que será salvo é um novo registro ou uma atualização de um registro existente.

      Quando o programa for executado, alguns campos deverão aparecer desabilitados e só serão habilitados ao clicar no botão Novo, permitindo assim digitar as informações, e também alguns botões da barra também estarão inacessíveis e só poderão serem clicados dependendo da situação. Essas mudanças de estado ocorrerão a cada evento; O método frmCadastroCliente_Load é executado ao carregar o formulário e parar ter a configuração inicial do formulário coloque o seguinte código no método, conforme mostra a Listagem 3.

      private void frmCadastroCliente_Load(object sender, EventArgs e)
      {
          tsbNovo.Enabled = true;
          tsbSalvar.Enabled = false;
          tsbCancelar.Enabled = false;
          tsbExcluir.Enabled = false;
          tstId.Enabled = true;
          tsbBuscar.Enabled = true;
          txtNome.Enabled = false;
          txtEndereco.Enabled = false;
          mskCep.Enabled = false;
          txtBairro.Enabled = false;
          txtCidade.Enabled = false;
          txtUf.Enabled = false;
          mskTelefone.Enabled = false;
      }

      Listagem 3. Configuração inicial do formulário

      Agora a Listagem 4 mostra o código do botão Novo.

      private void tsbNovo_Click(object sender, EventArgs e)
      {
          tsbNovo.Enabled = false;
          tsbSalvar.Enabled = true;
          tsbCancelar.Enabled = true;
          tsbExcluir.Enabled = false;
          tstId.Enabled = false;
          tsbBuscar.Enabled = false;
          txtNome.Enabled = true;
          txtEndereco.Enabled = true;
          mskCep.Enabled = true;
          txtBairro.Enabled = true;
          txtCidade.Enabled = true;
          txtUf.Enabled = true;
          mskTelefone.Enabled = true;
          txtNome.Focus();
          novo = true;
      
      }

      Listagem 4. Código do botão Novo

      Pode-se notar que na última linha de código está sendo atribuído true para a variável novo. Mais adiante será possível entender melhor que isso significa que ao clicar no botão Novo será incluído um novo registro.

      A Listagem 5 contém com o código do botão Salvar.

      private void tsbSalvar_Click(object sender, EventArgs e)
      {
          if (novo)
          {
            string sql = "INSERT INTO CLIENTE
            (NOME,ENDERECO,CEP,BAIRRO,CIDADE,UF,TELEFONE) "
            + "VALUES ('" + txtNome.Text + "', '" + txtEndereco.Text + "', '"
            + mskCep.Text + "', '" + txtBairro.Text
            + "', '" + txtCidade.Text + "', '" + txtUf.Text + "', '"
            + mskTelefone.Text + "')";
      
              SqlConnection con = new SqlConnection(connectionString);
              SqlCommand cmd = new SqlCommand(sql, con);
              cmd.CommandType = CommandType.Text;
              con.Open();
              try
              {
                  int i = cmd.ExecuteNonQuery();
                  if (i > 0)
                      MessageBox.Show("Cadastro realizado com sucesso!");
              }
              catch (Exception ex)
              {
                  MessageBox.Show("Erro: " + ex.ToString());
              }
              finally
              {
                  con.Close();
              }
          }
          else
          {
            string sql = "UPDATE CLIENTE SET NOME='" + txtNome.Text + "',
             ENDERECO='" + txtEndereco.Text + "', " +
             "CEP='" + mskCep.Text + "', BAIRRO='" + txtBairro.Text + "',
             CIDADE='" + txtCidade.Text + "', " +
             "UF='" + txtUf.Text + "', TELEFONE='" + mskTelefone.Text + "' WHERE ID=" + txtId.Text";
      
              SqlConnection con = new SqlConnection(connectionString);
              SqlCommand cmd = new SqlCommand(sql, con);
              cmd.CommandType = CommandType.Text;
              con.Open();
              try
              {
                  int i = cmd.ExecuteNonQuery();
                  if (i > 0)
                      MessageBox.Show("Cadastro atualizado com sucesso!");
              }
              catch (Exception ex)
              {
                  MessageBox.Show("Erro: " + ex.ToString());
              }
              finally
              {
                  con.Close();
              }
          }
      
          tsbNovo.Enabled = true;
          tsbSalvar.Enabled = false;
          tsbCancelar.Enabled = false;
          tsbExcluir.Enabled = false;
          tstId.Enabled = true;
          tsbBuscar.Enabled = true;
          txtNome.Enabled = false;
          txtEndereco.Enabled = false;
          mskCep.Enabled = false;
          txtBairro.Enabled = false;
          txtCidade.Enabled = false;
          txtUf.Enabled = false;
          mskTelefone.Enabled = false;
          txtId.Text = "";
          txtNome.Text = "";
          txtEndereco.Text = "";
          mskCep.Text = "";
          txtBairro.Text = "";
          txtCidade.Text = "";
          txtUf.Text = "";
          mskTelefone.Text = "";
      
      }

      Listagem 5. Código do botão salvar

      Neste código há um if que testa o valor da variável novo para saber se é um registro novo e executa o código.

      Quando novo=true, a variável SQL (que é uma string) recebe uma instrução SQL de INSERT que está sendo montada com os valores dos campos.

      Logo após é criado um objeto com do tipo SqlConnection que é a conexão com o banco e que recebe como parâmetro no momento da instanciação a variável connectionString que foi criada anteriormente e que contém a string de conexão.

      Depois é criado o objeto cmd que é um SqlCommand que recebe como parâmetro no seu construtor a variável SQL que contém a instrução SQL e o objeto con que é a conexão.

      O objeto cmd será responsável por executar a instrução SQL.

      Depois é definido o tipo de comando do objeto cmd, no caso Text, logo em seguida é aberta a conexão.

      Dentro do bloco try é executada a instrução SQL do objeto cmd através do método ExecuteNonQuery que retorna o número de linha afetadas, que no caso é armazenada na variável inteira i.

      Logo após testa-se se o valor de i é maior que 0, se sim significa que o registro foi incluído com sucesso.

      Voltando um pouco, se quando o if testa a variável novo e ela for false então executa o código contido no bloco else que significa que está fazendo uma atualização de um registro.

      O código é praticamente o mesmo, a não ser a instrução SQL que agora é um UPDATE.

      Logo depois é alterado o estado dos controles do formulário novamente.

      A Listagem 6 contém o código do botão Cancelar, que só alterada o estado dos controles e limpa os TextBox’s.

      private void tsbCancelar_Click(object sender, EventArgs e)
      {
          tsbNovo.Enabled = true;
          tsbSalvar.Enabled = false;
          tsbCancelar.Enabled = false;
          tsbExcluir.Enabled = false;
          tstId.Enabled = true;
          tsbBuscar.Enabled = true;
          txtNome.Enabled = false;
          txtEndereco.Enabled = false;
          mskCep.Enabled = false;
          txtBairro.Enabled = false;
          txtCidade.Enabled = false;
          txtUf.Enabled = false;
          mskTelefone.Enabled = false;
          txtId.Text = "";
          txtNome.Text = "";
          txtEndereco.Text = "";
          mskCep.Text = "";
          txtBairro.Text = "";
          txtCidade.Text = "";
          txtUf.Text = "";
          mskTelefone.Text = "";
      
      }

      Listagem 6. Código do botão cancelar

      A Listagem 7 mostra o código do botão Excluir, que é bem parecido ao do botão Salvar, só que agora com a instrução de DELETE.

      private void tsbExcluir_Click(object sender, EventArgs e)
      {
      
          string sql = "DELETE FROM CLIENTE WHERE ID=" + txtId.Text;
      
          SqlConnection con = new SqlConnection(connectionString);
          SqlCommand cmd = new SqlCommand(sql, con);
          cmd.CommandType = CommandType.Text;
          con.Open();
      
          try
          {
              int i = cmd.ExecuteNonQuery();
              if (i > 0)
                  MessageBox.Show("Registro excluído com sucesso!");
          }
          catch (Exception ex)
          {
              MessageBox.Show("Erro: " + ex.ToString());
          }
          finally
          {
              con.Close();
          }
      
          tsbNovo.Enabled = true;
          tsbSalvar.Enabled = false;
          tsbCancelar.Enabled = false;
          tsbExcluir.Enabled = false;
          tstId.Enabled = true;
          tsbBuscar.Enabled = true;
          txtNome.Enabled = false;
          txtEndereco.Enabled = false;
          mskCep.Enabled = false;
          txtBairro.Enabled = false;
          txtCidade.Enabled = false;
          txtUf.Enabled = false;
          mskTelefone.Enabled = false;
          txtId.Text = "";
          txtNome.Text = "";
          txtEndereco.Text = "";
          mskCep.Text = "";
          txtBairro.Text = "";
          txtCidade.Text = "";
          txtUf.Text = "";
          mskTelefone.Text = "";
      
      }

      Listagem 7. Código do botão Excluir

      A Listagem 8 mostra o código do botão Buscar.

      private void tsbBuscar_Click(object sender, EventArgs e)
       {
           string sql = "SELECT * FROM CLIENTE WHERE ID=" + tstId.Text;
      
           SqlConnection con = new SqlConnection(connectionString);
           SqlCommand cmd = new SqlCommand(sql, con);
           cmd.CommandType = CommandType.Text;
           SqlDataReader reader;
           con.Open();
      
           try
           {
               reader = cmd.ExecuteReader();
               if (reader.Read())
               {
                   tsbNovo.Enabled = false;
                   tsbSalvar.Enabled = true;
                   tsbCancelar.Enabled = true;
                   tsbExcluir.Enabled = true;
                   tstId.Enabled = false;
                   tsbBuscar.Enabled = false;
                   txtNome.Enabled = true;
                   txtEndereco.Enabled = true;
                   mskCep.Enabled = true;
                   txtBairro.Enabled = true;
                   txtCidade.Enabled = true;
                   txtUf.Enabled = true;
                   mskTelefone.Enabled = true;
                   txtNome.Focus();
                   txtId.Text = reader[0].ToString();
                   txtNome.Text = reader[1].ToString();
                   txtEndereco.Text = reader[2].ToString();
                   mskCep.Text = reader[3].ToString();
                   txtBairro.Text = reader[4].ToString();
                   txtCidade.Text = reader[5].ToString();
                   txtUf.Text = reader[6].ToString();
                   mskTelefone.Text = reader[7].ToString();
                   novo = false;
               }
               else
                   MessageBox.Show("Nenhum registro encontrado com o Id
                   informado!");
      
           }
           catch (Exception ex)
           {
               MessageBox.Show("Erro: " + ex.ToString());
           }
           finally
           {
               con.Close();
           }
      
           tstId.Text = "";
      
       }

      Listagem 8. Código do botão Buscar

      No código do botão Buscar contém uma instrução de SELECT que retorna o registro com o Id informado.

      Uma diferença é que além do objeto cmd agora também um objeto reader do tipo SqlDataReader que armazena o conteúdo retornado da consulta, como é mostrado na Listagem 9.

      reader = cmd.ExecuteReader();

      Listagem 9. Objeto reader recebendo o resultado da consulta executada pelo objeto cmd

      Em seguida, o if testa se há registro no reader com o método Read. Se sim, executa-se o bloco.

      O que há de diferente é que logo após alterar os estados dos controles o foco do cursor é posicionado no campo txtNome através do método Focus e é atribuído a cada campo o valor correspondente que está no reader.

      Para acessar os campos no reader é utilizado o índice do campo. Esse índice é a ordem dos campos, para poder vê-los basta executar um SELECT no SQL Server Management Studio e ver o retorno, o primeiro campo inicia no índice 0.

      Pronto, o CRUD está pronto, basta agora executar o programa e testar.

      Como dito no início do artigo, existem maneiras melhores de fazer esse CRUD, mais o intuito foi fazê-lo da maneira mais simples para um fácil entendimento.

      Deseja saber mais sobre desenvolvimento Clique Aqui!

      By Lucas Rodrigues Monteiro

      Bacharel em Sistemas da Informação, Certificado MCTS 70-680 / MOS, Trabalho como Administrador de Redes, Firewall e Servidores Windows e Linux! Minhas atividades favoritas são: Caminhar, Fazer Trilhas, Natureza, Insetos e claro ler sobre Tecnologia.

      Deixe um comentário

      Translate »