Extensões para DataReader, tratando valores de suas consultas SQL (DataReaderExtensions) C#(CSharp)

Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 02/12/2016


Extensões para DataReader

Com esta Classe vamos gerar Extensões para nosso DataReader onde poderemos receber e tratar todos os tipos de dados vindos de nossa consulta SQL, aqui podemos receber nossas colunas informando o NomeDaColuna além de tratar o recebimento de valores nulos, o que acarretaria um erro por vias normais.


Segue a Classe DataReaderExtensions

Crie uma pasta em seu projeto ou utilize alguma onde já tem suas funções customizadas, crie uma classe com o nome de DataReaderExtensions.cs, copie e cole o código abaixo.
Seu DataReader vai estar completo e mostrando todas as novas funcionalidades disponíveis e pronta para uso.

Observação: É preciso declarar o using com o caminho de sua pasta com suas customizações na classe onde utilizar nossas extensões.

Exemplo: using SeuProjeto.Customizacao;

/* 
 * DataReaderExtensions - Extensoes para DataReader 
 *  
 * Diversas rotinas para complementar DataReader, 
 * Preve o tratamento para campos nulos vindos das consultas,  
 * Você recebe os dados informamdo o nome da coluna de sua consulta, gerando um erro SQL caso este nome não seja encontrado.
 * 
 * Você vai encontrar aqui tratamento para todos os tipos de dados.
 * 
 * By Antonio Azevedo
 * 
 * Visite nossa página http://www.codigoexpresso.com.br
 * 
 *  Para utilizar basta colar esta classe em uma classe de seu projeto, 
 *  fazer referencia a esta pasta na classe onde deseja usar e os procedimentos vão estar disponíveis 
 *  quando fizer uso de um DataReader.
 *  
 * Exemplo :
 *            string MinhaString =  reader.GetStringOrEmpty("MinhaColuna");
 */
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Web;

public static class DataReaderExtensions
{
    /// <summary>
    /// Recebe o nome da Coluna e retorna seu Index
    /// </summary>
    public static int GetColumnIndex(this IDataReader reader, string columnName)
    {
        try
        {
            return reader.GetOrdinal(columnName);
        }

        catch (Exception e)
        {
            // Gera um erro SQL com o nome da coluna caso não encontrada
            string errorMessage = string.Format("Coluna não encontrada na consulta : [{0}]", columnName);
            var ctor = typeof(SqlException).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];
            SqlException sqlException = ctor.Invoke(new object[] { errorMessage, null, null, Guid.NewGuid() }) as SqlException;

            throw sqlException;
        }
    }

    /// <summary>
    /// Retorna string com dados da consulta, se nula retorna uma string vazia
    /// </summary>
    public static string GetStringOrEmpty(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? string.Empty : reader.GetString(columnIndex);
    }

    /// <summary>
    /// Retorna string com dados da consulta, se nula retorna null
    /// </summary>
    public static string GetStringOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? null : reader.GetString(columnIndex);
    }

    /// <summary>
    /// Retorna int com dados da consulta, se nulo retorna 0
    /// </summary>
    public static int GetInt(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? Convert.ToInt16(0) : (int)reader[columnName];
    }

    /// <summary>
    /// Retorna int com dados da consulta, se nulo retorna null
    /// </summary>
    public static int? GetIntOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);

        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetInt16(columnIndex);
    }

    /// <summary>
    /// Retorna Int16 com dados da consulta, se nulo retorna 0
    /// </summary>
    public static Int16 GetInt16(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? Convert.ToInt16(0) : reader.GetInt16(columnIndex);
    }

    /// <summary>
    /// Retorna Int16 com dados da consulta, se nulo retorna null
    /// </summary>
    public static Int16? GetInt16OrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);

        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetInt16(columnIndex);
    }

    /// <summary>
    /// Retorna Int32 com dados da consulta, se nulo retorna 0
    /// </summary>
    public static Int32 GetInt32(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? 0 : reader.GetInt32(columnIndex);
    }

    /// <summary>
    /// Retorna Int32 com dados da consulta, se nulo retorna 0
    /// </summary>
    public static Int32? GetInt32OrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);

        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetInt32(columnIndex);
    }

    /// <summary>
    /// Retorna Int64 com dados da consulta, se nulo retorna 0
    /// </summary>
    public static Int64 GetInt64(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? 0 : reader.GetInt64(columnIndex);
    }

    /// <summary>
    /// Retorna Int64 com dados da consulta, se nulo retorna null
    /// </summary>
    public static Int64? GetInt64OrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);

        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetInt64(columnIndex);
    }

    /// <summary>
    /// Retorna Float com dados da consulta, se nulo retorna 0
    /// </summary>
    public static float GetFloat(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return 0;
        }

        return reader.GetFloat(columnIndex);
    }

    /// <summary>
    /// Retorna Float com dados da consulta, se nulo retorna null
    /// </summary>
    public static float? GetFloatOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetFloat(columnIndex);
    }

    /// <summary>
    /// Retorna double com dados da consulta, se nulo retorna 0
    /// </summary>
    public static double GetDouble(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return 0;
        }

        return reader.GetDouble(columnIndex);
    }

    /// <summary>
    /// Retorna double com dados da consulta, se nulo retorna null
    /// </summary>
    public static double? GetDoubleOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetDouble(columnIndex);
    }

    /// <summary>
    /// Retorna decimal com dados da consulta, se nulo retorna 0
    /// </summary>
    public static decimal GetDecimal(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return 0;
        }

        return reader.GetDecimal(columnIndex);
    }

    /// <summary>
    /// Retorna decimal com dados da consulta, se nulo retorna null
    /// </summary>
    public static decimal? GetDecimalOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetDecimal(columnIndex);
    }

    /// <summary>
    /// Retorna Boolean com dados da consulta, se nulo retorna false
    /// </summary>
    public static Boolean GetBoolean(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        return reader.IsDBNull(columnIndex) ? false : reader.GetBoolean(columnIndex);
    }

    /// <summary>
    /// Retorna Boolean com dados da consulta, se nulo retorna null
    /// </summary>
    public static Boolean? GetBooleanOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }
        return reader.GetBoolean(columnIndex);
    }

    /// <summary>
    /// Retorna DateTime com dados da consulta, se nulo retorna null
    /// </summary>
    public static DateTime? GetDateTimeOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }
        return reader.GetDateTime(columnIndex);
    }

    /// <summary>
    /// Retorna DateTime com dados da consulta, se nulo retorna MinValue (Data Minima)
    /// </summary>
    public static DateTime GetDateTimeOrMinValue(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return DateTime.MinValue;
        }
        return reader.GetDateTime(columnIndex);
    }

    /// <summary>
    /// Retorna Byte[] (ByteArray) com dados da consulta, se nulo retorna null
    /// </summary>
    public static Byte[] GetByteArrayOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return (byte[])reader[columnIndex];
    }

    /// <summary>
    /// Retorna Byte com dados da consulta, se nulo retorna null
    /// </summary>
    public static Byte? GetByteOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetByte(columnIndex);
    }

    /// <summary>
    /// Retorna char com dados da consulta, se nulo retorna null
    /// </summary>
    public static char? GetCharOrNull(this IDataReader reader, string columnName)
    {
        int columnIndex = reader.GetColumnIndex(columnName);
        if (reader.IsDBNull(columnIndex))
        {
            return null;
        }

        return reader.GetChar(columnIndex);
    }
}


Exemplo de uso de nossa Classe

Para receber uma string em nossa consulta e prevenir que um possível valor nulo recebido seja convertido para uma string vazia faça assim

Exemplo: string MinhaString = reader.GetStringOrEmpty("MinhaColuna");

Para que possa receber os valores nulos (null) é preciso quando declarar seus dados declarar que podem receber valores nulos, você pode fazer isto colocando uma interrogação (?) no final do tipo de dado desejado.

Exemplo: DateTime? data = reader.GetDateTimeOrNull("datarecuperar");

Veja abaixo o exemplo de uma classe utilizando as novas extensões de nosso DataReaderExtensions

public Login login_slct_por_id(int idLogin)
{
    Login login = new Login();

    Conexao conn = new Conexao();

    try
    {
        SqlDataReader reader;
        SqlCommand cmd = new SqlCommand("[pcd_login_slct_por_id]", conn.conn);

        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@idlogin", idLogin);

        conn.conn.Open();

        reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            login.id = reader.GetInt32("id");
            login.login = reader.GetStringOrEmpty("login");
            login.apelido = reader.GetStringOrEmpty("apelido");
            login.senha = reader.GetStringOrEmpty("senha");
            login.email = reader.GetStringOrEmpty("emaillogin");
            login.matricula = reader.GetInt64("matricula");
            login.datarecuperar = reader.GetDateTimeOrNull("datarecuperar");
            login.hashrecuperar = reader.GetStringOrEmpty("hashrecuperar");
        }
    }
    catch (SqlException e)
    {
        login.id = -1;
    }

    conn.CloseConexao();

    return login;
}


Links Relacionados



Comentários

Antonio Azevedo (Administrador) em 06/12/2016 20:11:22
 

Ola pessoal, só pra constar, fiz uma alteração na classe GetInt(),
Conforme segue...

public static int GetInt(this IDataReader reader, string columnName)
{
    int columnIndex = reader.GetColumnIndex(columnName);
    return reader.IsDBNull(columnIndex) ? Convert.ToInt16(0) : (int)reader[columnName];
}

Em alguns casos apresentava problemas na conversão.