Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Não é possível converter um objeto do tipo 'System.DBNull'....

Ao executar meu código recebi a seguinte mensagem de erro na minha classe cliente:

Não é possível converter um objeto do tipo 'System.DBNull' no tipo 'Caelum.CaixaEletronico.Modelo.Usuarios.Cliente'."

Método onde acontece o erro

 public override bool Equals(object obj)
        {
            Cliente cliente = (Cliente)obj;
            return this.rg.Equals(cliente.rg) && this.cpf.Equals(cliente.cpf);

        }

Se alguém puder me explicar o que está gerando o erro e o por que dele acontecer eu agradeço.

5 respostas

Amigo, Bom dia, O erro ocorreu pois provavelmente o obj recebido por este método é nulo, e quando você efetua o cast do parametro realizando o (Cliente)obj, realmente não é possível. Não conheço o contexto do projeto todo, mas talvez a sugestão abaixo resolva o problema.

Espero ter ajudado. Bons estudos.

 public override bool Equals(object obj)
        {
        if(obj != null)
        {
                Cliente cliente = (Cliente)obj;
                return this.rg.Equals(cliente.rg) && this.cpf.Equals(cliente.cpf);
        }
        else
        {
            return false;
        }

        }

Olá amigo, obrigado pela ajuda porém o erro ainda acontece.

Segue meu código completo para maior entendimento:

Evento do click do botão

 private void button4_Click(object sender, EventArgs e)
        {
            Cliente _c1 = new Cliente();
            Cliente _c2 = new Cliente();
            _c1.Nome = "Victor";
            _c1.rg = "4563215";
            _c2.Nome = "Mario";
            _c2.rg = "458678";
            Conta c = new ContaCorrente() { Numero = 1, Titular = _c1 };
            Conta c2 = new ContaCorrente() { Numero = 2, Titular = _c2 };
            comboContas.Items.Add(c);
            comboContas.Items.Add(c2);
            comboContas.DisplayMember = "Titular";
        }
    }

Classe Cliente

namespace Caelum.CaixaEletronico.Modelo.Usuarios
{
        class Cliente
        {
            public string Nome { get; set; }
            public string rg;
            public string cpf;
            public string endereco;
            public int idade;
            private bool EEmancipado;

            public Cliente(string nome)
            {
                this.Nome = nome;
            }

            public Cliente() { }

            public bool PodeAbrirContaSozinho
            {
                get
                {
                    var maiorDeIdade = this.idade >= 18;
                    var emancipado = (this.EEmancipado);
                    var possuiCPF = !string.IsNullOrEmpty(this.cpf);
                    return (maiorDeIdade || emancipado) && possuiCPF;
                }
            }

            public bool EhMaiorDeIdade()
            {
                return this.idade >= 18;
            }


        //Novo método
        public override bool Equals(object obj)
        {
            if (obj != null)
            {
                Cliente cliente = (Cliente)obj;
                return this.rg.Equals(cliente.rg) && this.cpf.Equals(cliente.cpf);
            }
            else
            {
                return false;
            }

        }



        public override string ToString()
        {
            return "Cliente Nome: " + this.Nome + " Rg: " + this.rg;
        }

    }
}

Obs: Mesmo fazendo a verificação o erro acontece na seguinte linha:

Cliente cliente = (Cliente)obj;

passando por nossa verificação

  if (obj != null)

Pois o obj está recebendo System.DBNull que é diferente de null

Não estou entendendo o que é o System.DBNull e por que ele está sendo referenciado ao obj

Oi amigo,

Criei um projeto aqui no meu visual studio um projeto com os códigos que me passou, tive que comentar algumas linhas pois não possuo algumas classes referenciadas no seu código.

Então fiz a chamada do seu método Equals passando um object com DBNull.Value atribuído, e consegui simular o mesmo erro que você tomou.

Você tem toda razão no post anterior, DBNull é diferente de null. Foi desatenção minha...

Através do DBNull.Value você consegue saber se o banco de dados retornou um valor nulo, ou seja, quando o dado requisitado está ausente no banco de dados. Muitas colunas em banco de dados permitem valores nulos.

Isso não deveria ocorrer com campos importantes como CPF e RG, se você é o administrador do BD, sugiro tornar estes campos obrigatórios na tabela e no formulário de cadastro do cliente, se houver.

Corrigindo a minha sugestão de solução anterior, tente fazer o seguinte:

public override bool Equals(object obj)
        {
            if (obj != DBNull.Value)
            {
                Cliente cliente = (Cliente)obj;
                return this.rg.Equals(cliente.rg) && this.cpf.Equals(cliente.cpf);
            }
            else
            {
                return false;
            }

        }
solução!

Olá Alexandre,

Muito obrigado pela ajuda, agora está executando normalmente o projeto.

De nada, que bom que pude ajuda-lo. Peço que marque minha resposta como solução do seu problema, isso irá me ajudar com a pontuação do fórum.