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:
O valor é retornado nulo. Como lidar com esse tipo de problema?
Utilizo o OleDb, ou seja, Access e C#.
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:
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP