AnswerBun.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 [email protected]";

                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 [email protected]";

            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!

Related Questions

Criptografar senha em groovy

1  Asked on January 6, 2022 by r-santos

       

Excel VBA altera o formato da data para mm/dd/yyyy

1  Asked on January 6, 2022 by vanessa-cotarelli

   

Erro ao importar pygame no Pycharm

5  Asked on January 6, 2022 by simionato

       

Encadeamento de pipelines

1  Asked on January 6, 2022 by gabriel-hardoim

       

Conflito na instalação da ultima versão do hive

2  Asked on January 6, 2022 by rubstackoverflow

   

Aumentar tamanho do GestureDetector Flutter

1  Asked on January 6, 2022 by jeff-henrique

   

Seletor de sexo em condicional if

3  Asked on January 4, 2022 by diego-roney

   

Obter nomes de uma lista que possuem tamanho igual a 4

2  Asked on January 4, 2022 by p-sampaio

   

Decremento, incremento e soma de ponteiros em C

1  Asked on January 4, 2022 by thiago-cerqueira

   

Plotar na horizontal (coluna a coluna) – Python

1  Asked on January 4, 2022 by diego-provesi

     

Problema com PHPMailer no envio de e-mails

1  Asked on January 4, 2022 by victor-wurthmann

         

Pegar mais de um elemento de um Array

1  Asked on January 2, 2022

 

receber json para tornar o meu Echart dinamico

2  Asked on January 2, 2022 by jooes

       

Qual é a diferença entre Promises e Observables?

4  Asked on January 2, 2022 by matheus-bessa

 

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP