Classe para tratar valores nulos vindos de nossa Query SQL, C#(CSharp).

Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 22/08/2016


Tratando os valores recebidos em suas consultas SQL

Quando nossa consulta não esta tratada pode acontecer de recebermos um valor nulo e não previsto acarretando um erro em nossa aplicação, para contornar este problema segue uma serie de funções para conversão destes valores retornando valores default e prevenindo erros.

Classe ConverteReader

ConverteInt() - Converte valores inteiros, valor de retorno default (0)
ConverteDouble() - Converte valores double, valor de retorno default (0,0)
ConverteDecimal() - Converte valores decimal, valor de retorno default (0,0)
ConverteDateTime() - Converte valores DateTime, valor de retorno default (MinValue), ou seja o menor valor para data e time previsto em C#
ConverteBoolean() - Converte valores boolean, valor de retorno default (false)
ConverteString() - Converte valores string, valor de retorno default (string vazia)

canNull parametro para informar que quando o valor a ser convertido é nulo este pode retornar como nulo

Crie uma Classe em seu projeto de o nome de ConverteReader.cs copie e cole o código abaixo.

/* 
 * Rotinas para tratamento de reader em leitura banco de dados, evitando erros em possíveis valores nulos
 * 
 * Visite nossa página http://www.codigoexpresso.com.br
 * 
 * by Antonio Azevedo
 *  
 * Convertendo valores esperados em sua query
 * o parametro 'canNull' é utilizado quando o valor de retorno é nulo e se deseja mante-lo assim
 * 
 * Inteiros
 *  - int valor = ConverteReader.ConverteInt(reader["valor"])
 * 
 * Double
 *  - double? valor = ConverteReader.ConverteDouble(reader["valor"], false)
 *
 * Decimal
 *  - decimal? valor = ConverteReader.ConverteDecimal(reader["valor"], false)
 *  
 *  Datas
 * - DateTime? valor = ConverteReader.ConverteDateTime(reader["valor"], false)
 * 
 * Verdadeiro ou Falso
 * - Boolean? valor = ConverteReader.ConverteBoolean(reader["valor"], false)
 * 
 * Strings
 * - string valor = ConverteReader.ConverteString(reader["valor"], false)
 * 
 */

using System;


public static class ConverteReader
{
    /// <summary>
    /// Converte Reader para Int32 verificando se é nulo
    /// </summary>
    ///   /// <param name="Valor">Valor vindo de seu reader</param>
    /// <returns>Int32 com o resultado</returns>
    /// 
    public static Int32 ConverteInt(object Valor)
    {
        Int32 newValor = 0;

        try
        {
            newValor = Convert.ToInt32(Valor);
        }
        catch
        {
            newValor = 0;
        }

        return newValor;
    }

    /// <summary>
    /// Converte Reader para Double verificando se é nulo
    /// </summary>
    /// <param name="Valor">Valor vindo de seu reader</param>
    /// <param name="canNull">Caso o valor seja nulo se pode retornar como nulo</param>
    /// <returns>double com o resultado</returns>
    public static double? ConverteDouble(object Valor, Boolean canNull = false)
    {
        double? newValor = null;

        if (canNull && Valor == null)
        {
            return newValor;
        }

        try
        {
            newValor = Convert.ToDouble(Valor);
        }
        catch
        {
            newValor = 0;
        }

        return newValor;
    }

    /// <summary>
    /// Converte Reader para Decimal verificando se é nulo
    /// </summary>
    /// <param name="Valor">Valor vindo de seu reader</param>
    /// <param name="canNull">Caso o valor seja nulo se pode retornar como nulo</param>
    /// <returns>Decimal com o resultado</returns>
    public static decimal? ConverteDecimal(object Valor, Boolean canNull = false)
    {
        decimal? newValor = null;

        if (canNull && Valor == null)
        {
            return newValor;
        }

        try
        {
            newValor = Convert.ToDecimal(Valor);
        }
        catch
        {
            newValor = 0;
        }

        return newValor;
    }

    /// <summary>
    /// Converte Reader para DateTime verificando se é nulo
    /// </summary>
    /// <param name="Valor">Valor vindo de seu reader</param>
    /// <param name="canNull">Caso o valor seja nulo se pode retornar como nulo</param>
    /// <returns>double</returns>
    public static DateTime? ConverteDateTime(object Valor, Boolean canNull = false)
    {
        DateTime? newValor = null;

        if (canNull && Valor == null)
        {
            return newValor;
        }

        try
        {
            newValor = Convert.ToDateTime(Valor);
        }
        catch
        {
            newValor = DateTime.MinValue;
        }

        return newValor;
    }

    /// <summary>
    /// Converte Reader para Boolean verificando se é nulo
    /// </summary>
    /// <param name="Valor">Valor vindo de seu reader</param>
    /// <param name="canNull">Caso o valor seja nulo se pode retornar como nulo</param>
    /// <returns>Boolean com o resultado</returns>
    public static Boolean? ConverteBoolean(object Valor, Boolean canNull = false)
    {
        Boolean? newValor = null;

        if (canNull && Valor == null)
        {
            return newValor;
        }

        try
        {
            newValor = Convert.ToBoolean(Valor);
        }
        catch
        {
            newValor = false;
        }

        return newValor;
    }

    /// <summary>
    /// Converte Reader para string verificando se é nulo
    /// </summary>
    /// <param name="Valor">Valor vindo de seu reader</param>
    /// <param name="canNull">Caso o valor seja nulo se pode retornar como nulo</param>
    /// <returns>string com o resultado</returns>
    public static string ConverteString(object Valor, Boolean canNull = false)
    {
        string newValor = null;

        if (canNull && Valor == null)
        {
            return newValor;
        }

        newValor = (string)Valor ?? "";

        return newValor;
    }
}


Exemplo de uso da classe

public List<ModAluno> ListaAlunos()
{
    List<ModAluno> lalunos = new List<ModAluno>();
 
    // Instancia nossa Conexao
    Conexao conexao = new Conexao(TipoConexao.Conexao.WebConfig);

    // Se existe erro na conexao move o erro para a classe de acesso 
    if (conexao.ExisteErro())
    {
        setMensagemErro(conexao.mErro);
        return lalunos;
    }

    try
    {
        SqlDataReader reader;
                
        string query = "select a.idaluno, a.nome, a.email, a.dtcadastro, a.valor, c.idcurso, descricao_curso = c.descricao " +
        "from alunos a " +
        "inner join cursos c on c.idcurso = a.idcurso";

        SqlCommand cmd = new SqlCommand(query, conexao.conn);
        cmd.CommandType = System.Data.CommandType.Text;

        // Abre nossa Conexao
        if (conexao.OpenConexao() == false)
        {
            setMensagemErro(conexao.mErro);
            return null;
        }

        reader = cmd.ExecuteReader();

        while (reader.Read())
        {
                   
            lalunos.Add(read_Aluno(reader));
        }
    }
    catch (SqlException e)
    {
        setMensagemErro(e.Message.ToString());
    }

    // Fecha nossa Conexao
    conexao.CloseConexao();

    return lalunos;
}

private ModAluno read_Aluno(SqlDataReader reader)
{
    ModAluno aluno = new ModAluno();
    aluno.IdAluno = (Int32)reader["idaluno"];
    aluno.Nome = ConverteReader.ConverteString(reader["nome"]);
    aluno.Email = ConverteReader.ConverteString(reader["email"]);
    aluno.DtCadastro = ConverteReader.ConverteDateTime(reader["dtcadastro"]);
    aluno.Valor = ConverteReader.ConverteDecimal(reader["valor"]);
    aluno.Curso.idCurso = ConverteReader.ConverteInt(reader["idcurso"]);
    aluno.Curso.Descricao = ConverteReader.ConverteString(reader["descricao_curso"]);

    return aluno;
}


Links Relacionados



Comentários