TransWikia.com

Valor nulo na soma

Stack Overflow em Português Asked by Thales on December 18, 2020

Estou com um problema na minha query, quando há valores na tabela a soma acontece normalmente como programado:

string nomeProd = item.SubItems[0].Text;
                double Quantidade = Convert.ToDouble(item.SubItems[2].Text);
                cmdQry.CommandText = "SELECT SUM(quantidadeMat) FROM tbl_EstoqueMat WHERE reservadoMat=False AND nomeMat=@nome";

                cmdQry.Parameters.Clear();
                cmdQry.Parameters.Add(new OleDbParameter("@nome", nomeProd));

                try
                {
                    //SOMA AQUI, OCORRE NORMALMENTE QUANDO HÁ DADOS NA TABELA
                    double soma = Convert.ToDouble(cmdQry.ExecuteScalar());

Quando não há dados na tabela, ou não estão disponíveis para soma, ocorre o seguinte erro:

Erro de DBNull

O valor é retornado nulo. Como lidar com esse tipo de problema?

Utilizo o OleDb, ou seja, Access e C#.

2 Answers

Antes de tudo tem dois problemas no seu código. O primeiro é o uso de double, isto não é adequado. O segundo é que está convertendo algo que você não pode garantir que pode ser convertido, deveria ser algo assim:

if (!decimal.TryParse(item.SubItems[2].Text, out var quantidade)) //faz alguma coisa se deu erro e encerra a execução

Mas o problema específico é justamente o que está indicando na sua pergunta, há situação que o valor retornado é nulo, então você tem que trabalhar com essa opção e tratar esse valor adequado. O que você não deve fazer é deixar dar exceção e capturá-la para fazer alguma coisa. Quase toda captura de exceção em código está errada e é gambiarra de quem não quer consertar o erro em seu código.

Assim como eu consertei o problema acima verificado se deu dará tudo certo neste caso também teria que fazer algo parecido:

var resultado = cmdQry.ExecuteScalar();
if (resultado == DBNull.Value) //faz alguma coisa aqui para tratar o erro e encerra
var soma = ToDecimal(resultado);

Coloquei no GitHub para referência futura.

No caso eu coloquei um using static System.Convert; no começo do código.

Dessa forma só será feita a conversão se não for nulo.

Use uma regra: se não souber usar um mecanismo da linguagem como a exceção ou o tipo double, entre outros, não use. Quando você usa algo que não entende como funciona acaba entrando nesta situação:

Fiat 147 todo detonado andando pelas ruas

Correct answer by Maniero on December 18, 2020

Você pode utilizar o "catch" para tratar o erro recebido.

Ex:

            string nomeProd = item.SubItems[0].Text;
            double Quantidade = Convert.ToDouble(item.SubItems[2].Text);
            cmdQry.CommandText = "SELECT SUM(quantidadeMat) FROM tbl_EstoqueMat WHERE reservadoMat=False AND nomeMat=@nome";

            cmdQry.Parameters.Clear();
            cmdQry.Parameters.Add(new OleDbParameter("@nome", nomeProd));

            try
            {
                //SOMA AQUI, OCORRE NORMALMENTE QUANDO HÁ DADOS NA TABELA
                double soma = Convert.ToDouble(cmdQry.ExecuteScalar()); 

            }
            catch 
            {
              MessageBox.Show("O valor recebido é nulo");
            }

Answered by Rickafds on December 18, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP