Validando Valores nulos vindos de nosso Banco de Dados C#(CSharp)

Automatizando a validação de valores nulos vindos do Banco de Dados.


Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 11/07/2016

Validando valores nulos vindos de nosso Banco de Dados

Quando definimos que uma determinada coluna em nosso Banco de Dados pode ser nula, seja este SqlServer, MySql ou outro qualquer, estes dados precisam ser tratados ou em nossa Query ou em nossa Classe onde faremos a leitura, caso contrario se nossa Query retornar um valor nulo será disparado um erro em tempo de execução.

Exemplo de tratamento de erro em uma Query SqlServer

-- Trantando um inteiro, se este for nullo retorna zero
SELECT ISNULL(minhaColuna , 0) as minhaColuna FROM MinhaTabela

-- Tratando uma string, se esta for nulla retora ''
select ISNULL(minhaColuna ,'') as minhaColuna FROM MinhaTabela

-- Tratando uma datatime, se esta for nula retorna data especificada 
select ISNULL(minhaColuna , '2016-07-11 10:30') as minhaColuna from MinhaTabela

Para o MySql simplemente mude a função ISNULL para IFNULL e o restante fica igual.

E quando não temos o controle sobre os dados recebidos ?

O grande problema é que nem sempre temos o controle do que vem do Banco de Dados, muitas vezes temo uma Analista gerando as Procedures e este acaba mandando valores nulos como resposta, para evitar erros quando fizermos a leitura dos dados vamos criar uma classe para tratar cada tipo de dado recebido.

Crie uma Classe em seu projeto, na pasta Models e de nome de ValidandoNulos.cs, copie e cole o código abaixo :

Classe para converter dados vindos de nosso Banco de Dados

/* 
 * Rotinas para validar dados vindos de nosso Banco de Dados com possíveis valores nulos
 * 
 * Visite nossa página http://www.codigoexpresso.com.br
 * 
 * by Antonio Azevedo
 *  
 */
using System;
public class ValidandoNulos
{
    /// <summary>
    /// Tenta converter um objeto como data, 
    ///  --- se apresentar erro e DataNull=False retorna menor data possivel em C#
    ///  ---                      DataNull=true  retorna null 
    /// </summary>
    /// <param name="data">Objeto DateTime</param>
    /// <param name="DataNull">(true/false) se deseja receber um valor nulo</param>
    /// <returns>DateTime/null</returns>
    public static DateTime? ConverteData(object data, Boolean DataNull=false)
    {
        DateTime newData;
        try
        {
            newData = Convert.ToDateTime(data);
        }
        catch (Exception)
        {
            if (DataNull)
            {
                return null;
            }
            else
            {
                return DateTime.MinValue;
            }
        }

        return newData;
    }

    /// <summary>
    /// Tenta converter um objeto como string 
    /// --- Se apresentar erro retorna ""
    /// </summary>
    /// <param name="Valor">Objeto string</param>
    /// <returns>retorna string</returns>
    public static string ConverteString(object Valor)
    {
        string newValor;
        try
        {
            newValor = (string)Valor;
        }
        catch (Exception)
        {
            return "";
        }

        return newValor;
    }

    /// <summary>
    /// Tenta converter um objeto como Int32 
    /// --- Se apresentar erro retorna 0
    /// </summary>
    /// <param name="Valor">Objeto int</param>
    /// <returns>retorna Int32</returns>
    public static Int32 ConverteInt32(object Valor)
    {
        Int32 newValor;
        try
        {
            newValor = ConverteInt32(Valor);
        }
        catch (Exception)
        {
            return 0;
        }

        return newValor;
    }

    /// <summary>
    /// Tenta converter um objeto como Boolean 
    /// --- Se apresentar erro retorna false
    /// </summary>
    /// <param name="Valor">Objeto Boolean</param>
    /// <returns>retorna Boolean</returns>
    public static Boolean ConverteBoolean(object Valor)
    {
        Boolean newValor;
        try
        {
            newValor = ConverteBoolean(Valor);
        }
        catch (Exception)
        {
            return false;
        }

        return newValor;
    }
}


Exemplo de uso

empresa.id = ValidandoNulos.ConverteInt32(reader["id"]);
empresa.Nome = ValidandoNulos.ConverteString(reader["nome"]);
empresa.Data = ValidandoNulos.ConverteData(reader["dtcadastro"],false);
empresa.Ativa = ValidandoNulos.ConverteBoolean(reader["ativo"]);

Assim garantiremos que os dados nulos sejam tratados e não teremos surpresas em tempo de execução.


Links Relacionados



Comentários