16
respostas

CRUD C# e access

Estou fazendo um CRUD para um emprego. Ele se conecta normalmente no banco, mas não faz nenhuma função do CRUD (Criar, Lê, Deletar ou editar). Preciso mto da ajuda de vcs!

segue o código

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace TesteAdrianoCRUD
{
    public partial class frmCadastro : Form
    {
        public frmCadastro()
        {
            InitializeComponent();
        }

        private void btnDetalhes_Click(object sender, EventArgs e)
        {
            frmDetalhes _frmDetalhes = new frmDetalhes();
            _frmDetalhes.Show();

        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome.Text = string.Empty;
            mskDataNascimento.Text = string.Empty;
            mskCpf.Text = string.Empty;
            mskTelefone.Text = string.Empty;
        }

        private void btnSairCadastro_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void txtNome_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnInserir_Click(object sender, EventArgs e)
        {
            string strcon = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath+@"\Cliente.mdb";
            string comando = "INSERT INTO Cliente (nome, telefone, cpf, data_nascimento) Values (@nome, @telefone, @cpf, @data_nascimento)";

            OleDbConnection con = new OleDbConnection(strcon);
            OleDbCommand com = new OleDbCommand(comando, con);
            com.Parameters.Add("@nome", OleDbType.VarChar).Value = txtNome.Text;
            com.Parameters.Add("@telefone", OleDbType.VarChar).Value = mskTelefone.Text;
            com.Parameters.Add("@cpf", OleDbType.VarChar).Value = mskCpf.Text;
            com.Parameters.Add("@data_nascimento", OleDbType.VarChar).Value = mskDataNascimento.Text;

            try
            {
                con.Open();
                com.ExecuteNonQuery();
                MessageBox.Show("Cadastro com sucesso!");

            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
            finally
            {
                con.Close();
            }

        }

        private void frmCadastro_Load(object sender, EventArgs e)
        {

        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            string strcon = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + @"\Cliente.mdb";

            if (MessageBox.Show("Deseja realmente excluir este nome? ", "Cuidado",
            MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
            {
                MessageBox.Show("Operação cancelada!");
            }
            else
            {
                string comando = "delete FROM Cliente WHERE nome=@nome ";

                OleDbConnection con = new OleDbConnection(strcon);
                OleDbCommand com = new OleDbCommand(comando, con);

                com.Parameters.Add("@nome", OleDbType.VarChar).Value = txtPesquisa.Text;

                try
                {
                    con.Open();
                    com.ExecuteNonQuery();
                    MessageBox.Show("Cliente excluido com SUCESSO!");
                }
                catch (Exception E)
                {
                    MessageBox.Show(E.Message);
                }
                finally
                {
                    con.Close();
                }

            }
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            string strcon = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + @"\Cliente.mdb";
            string comando = "UPDATE Cliente SET nome=@nome, telefone=@telefone, cpf=@cpf, data_nascimento=@data_nascimento";

            OleDbConnection con = new OleDbConnection(strcon);
            OleDbCommand com = new OleDbCommand(comando, con);
            com.Parameters.Add("@nome", OleDbType.VarChar).Value = txtNome.Text;
            com.Parameters.Add("@telefone", OleDbType.VarChar).Value = mskTelefone.Text;
            com.Parameters.Add("@cpf", OleDbType.VarChar).Value = mskCpf.Text;
            com.Parameters.Add("@data_nascimento", OleDbType.VarChar).Value = mskDataNascimento.Text;

            try
            {
                con.Open();
                com.ExecuteNonQuery();
                MessageBox.Show("Dados alterados com sucesso!");
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
            finally
            {
                con.Close();
            }

        }

        private void btnPesquisa_Click(object sender, EventArgs e)
        {
            string strcon = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + @"\Cliente.mdb";
            string comando = "SELECT * FROM Cliente WHERE nome=@nome";

            OleDbConnection con = new OleDbConnection(strcon);
            OleDbCommand com = new OleDbCommand(comando, con);

            com.Parameters.Add("@nome", OleDbType.VarChar).Value = txtNome.Text;

            try
            {
                if (txtPesquisa.Text == "")
                {
                    throw new Exception("Digite um nome para pesquisar!");
                }
                con.Open();

                OleDbDataReader cs = com.ExecuteReader();

                if (cs.HasRows == false)
                {
                    throw new Exception("Nome não cadastrado!");
                }
                else
                {
                    cs.Read();
                    mskDataNascimento.Text = Convert.ToString(cs["data_nascimento"]);
                    mskCpf.Text = Convert.ToString(cs["cpf"]);
                    mskTelefone.Text = Convert.ToString(cs["telefone"]);
                }
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
            finally
            {
                con.Close();
            }

        }

        private void btnInserir_Click_1(object sender, EventArgs e)
        {

        }
    }
}
16 respostas

Oi Cristiano, a primeira coisa que precisamos saber é o que acontece especificamente. Tem muito código e vc falou que não insere.. Dá algum erro? Você já tentou debugar ou imprimir uns pedaços do código para ver o que acontece?

Então não aparece nenhum erro.

Inserir: Não insere, tb não aparece nenhum erro

Pesquisar: Tem dado no banco (coloquei na mão) só que não aparece nada.

Editar e Deletar não da pra testar sem pesquisar antes!

Mas entra nos métodos? Preciso que você saia colocando uns prints ou break points para dar mais informações para a gente.. só vendo o código sem executar e com algo tão genérico, fica mais complicado.

tem como eu mandar o projeto todo e vcs darem uma olhada pra mim? Por favor!

Oi Cristiano, não vai rolar.. executar código de projeto pessoal não vai dar... vc tem o seu banco específico e tudo mais... Mas estamos aqui e vamos tentar ajudá-lo.

Ok. Aparentemente p evento onclick não entra no método para executar a função (Inserir). O (pesquisar) ele entra no método só que não sobe o dado pesquisado. O que pode estar acontecendo?

Ele não esta chamando o método. O que eu faço pra arrumar isso?

Olá Cristiano,

no Visual Studio abre o layout da tela que você está mexendo e dá um duplo clique no botão de inserir. Se ele gerar um novo método quer dizer que realmente ele não estava relacionando o evento de clicar com o método btnInserir_Click. Caso contrário, se ele mostrar o método btnInserir_Click quer dizer que este é realmente o método que está sendo executado.

No caso do pesquisar, para fazer um teste, troca o

if (cs.HasRows == false)
{
        throw new Exception("Nome não cadastrado!");
}
else
{
        cs.Read();
        mskDataNascimento.Text = Convert.ToString(cs["data_nascimento"]);
        mskCpf.Text = Convert.ToString(cs["cpf"]);
        mskTelefone.Text = Convert.ToString(cs["telefone"]);
}

por:

if (cs.Read())
{
        cs.Read();
        MessageBox.Show(Convert.ToString(cs["data_nascimento"]));
        MessageBox.Show(Convert.ToString(cs["cpf"]));
        MessageBox.Show(Convert.ToString(cs["telefone"]));
        mskDataNascimento.Text = Convert.ToString(cs["data_nascimento"]);
        mskCpf.Text = Convert.ToString(cs["cpf"]);
        mskTelefone.Text = Convert.ToString(cs["telefone"]);

}
else
{
        MessageBox.Show(Convert.ToString(cs["Não achou nada"]));
        throw new Exception("Nome não cadastrado!");
}

E veja quais mensagens vão aparecer na tela quando você pesquisar.

aeee...agora ta começando a funfar...rs Foi aquilo mesmo que vc falou...o evento não estava relacionado ele gerava um outro método. Com relação ao "pesquisar". Qdo eu coloco o nome pra pesquisar parece "não achou nada" mas tem cliente cadastrado no banco. O que to achando estranho é que ele conecta direitinho td, mas parece que não enxerga a tabela!

Obrigado por me ajudar tenho que entregar isso até amanhã! é uma oportunidade de emprego ;)

Agora qdo eu tento inserir algum dado aparece "Tipo De Dados Imcompatível Na Expressão De Critério" com "M" mesmo.

Tem alguma coisa no seu banco que não está batendo com o valor que você manda na sua query. Meu chute é que deve ser a data_nascimento. Você manda como um varchar, mas tem que ver se não é um date no seu banco.

O Access 2016 esta criada assim: ID_Cliente - numeração automática

nome - Texto Longo

telefone - Numérico

cpf - Numérico

data_nascimento - Numérico"

O tipo de dados tem apenas "texto longo" ou "texto curto" não existe apenas só "texto".

Nunca trabalhei com o Access. Mas algo que acho que pode ser o problema é que telefone, cpf e data_nascimento estão marcados como numéricos, mas você adiciona nos parâmetros como um varchar. Tem que pesquisar quais os tipos do OleDbType são compatíveis com o texto longo e númérico do Access. Meu chute é que texto longo pode ser o VarChar mesmo e o numerico pode ser o Integer ou Numeric

Eu alterei todos os tipos para "texto curto" funcionou de boa... esta inserindo, alterando e deletando normalmente. Agora só a pesquisa que não esta funcionando direito. Peço para pesquisar aparece "Não achou nada"

Na query está fazendo a igualdade nome=@nome, ou seja, o nome que você digitar no campo da pesquisa tem que ser exatamente igual ao que está no banco. Além disso, tava com um erro no código que eu mandei que fazia Read() duas vezes, mas basta uma vez só:

if (cs.Read())
{    
        MessageBox.Show(Convert.ToString(cs["data_nascimento"]));
        MessageBox.Show(Convert.ToString(cs["cpf"]));
        MessageBox.Show(Convert.ToString(cs["telefone"]));
        mskDataNascimento.Text = Convert.ToString(cs["data_nascimento"]);
        mskCpf.Text = Convert.ToString(cs["cpf"]);
        mskTelefone.Text = Convert.ToString(cs["telefone"]);
}
else
{
        MessageBox.Show("Não achou nada");
        throw new Exception("Nome não cadastrado!");
}

alterei...mesmo assim vai direto pro "else" "Não achou nada" "Nome não cadastrado" eu coloquei exatamente como esta no banco.