Extensões para DataReader, tratando valores de suas consultas SQL (DataReaderExtensions) C#(CSharp)
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
- Curso Instalando e configurando o MySql e WorkBench
- Arquitetura CQRS
- Arrays em C#(CSharp)
- Aula 11 - Acessando Banco de Dados SQL SERVER - Criando Consultas em sua aplicação em Asp.Net MVC 4 com C#(CSharp)
- Aula 12 - MS SQL Server - Comandos SQL e Stored Procedures em sua aplicação em Asp.Net MVC 4 com C#(CSharp)
- Aula 13 - MySql - Comandos SQL e Stored Procedures em sua aplicação em Asp.Net MVC 4 com C#(CSharp)
- Aula 15 - Download das ferramentas necessárias para o nosso curso de Asp.Net MVC 4 com C#(CSharp)
- Aula 16 - Criando o banco de dados e configurando o SQLServer para nosso curso de Asp.Net MVC 4 com C#(CSharp)
- Aula 17 - Criando o banco de dados e configurando o SQLServer EXPRESS para nosso curso de Asp.Net MVC 4 com C#(CSharp)
- Aula 18 - Criando o banco de dados e configurando o MySQL para nosso curso de Asp.Net MVC 4 com C#(CSharp)
- C#(CSharp) Converter inteiro para Hexadecimal e Hexadecimal para Inteiro
- C#(CSharp) Exemplo de Conversão de um List<> de uma classe qualquer para um DataTable.
- C#(CSharp) Função para verificar se um determinado número é Primo
- Calcular Idade C# (CSharp), diferença anos entre duas datas
- Classe com Métodos de extensão C# (CSharp)
- Classe para fazer Conexão MS SqlServer em C#(CSharp)
- Classe para fazer Conexão MySql em C#(CSharp)
- Classe para Ler e Gravar Cookies - Asp.Net MVC 4 com C# (CSharp)
- Classe para tratar valores nulos vindos de nossa Query SQL, C#(CSharp).
- Classes anônimas em C#(CSharp)
- Comando nameof() C#(CSharp)
- Comando NULLIF no SQLServer.
- Compare duas strings ignorando maiúsculas e minúsculas C#(CSharp).
- Consulta SQLServer com paginação
- Criando Tabelas Temporarias em MS-SqlServer
- Criar Classes Dinâmicas usando DynamicObject e ExpandoObject em C# (CSharp)
- Curso Instalando e configurando o MS SQL Server Express 2014 e Management Studio 2014
- Definir o dia em um DateTime.
- DELETE CASCADE no SqlServer
- Desvendando o Poder da Função STRING_AGG no SQL Server para concatenação de dados
- Diferença entre parâmetros REF e OUT em C#(CSharp)
- DROP TABLE IF EXISTS no SQL Server.
- Emitir sons pelo auto-falante do computador em C# (CSharp)
- Estrangulando um monólito C#(CSharp)
- Exemplo de acesso a dados com SQL Server em C#.
- Exemplo de consulta em SqlServer para encontrar uma chave Estrangeira
- Exemplo de Stored Procedure com tratamento de erros e transação. (SqlServer)
- Exemplos de Stored Procedure MySql
- Exemplos de Stored Procedure SQL Server
- Explorando Tipos de Dados Personalizados no SqlServer: Utilidade e Impacto na Performance
- Fazendo a paginação de consultas em MySQL com o comando Limit e Offset
- Formatando datas MySql
- Formatando datas SqlServer
- Formatar CEP em C# (CSharp)
- Função MySql Calcular Idade
- Função para devolver data do próximo dia da semana informado C#(CSharp).
- Função para gerar tabela com listagem contendo intervalo entre duas datas. (SqlServer)
- Gerando números randômicos para sorteio de jogos de azar C#(CSharp)
- Grafana Loki e .NET Framework com C#
- Incrementando e decrementando variáveis em C#(CSharp)
- Injeção de dependência
- Integrando MySql Connector em sua aplicação C#(CSharp) no Visual Studio
- Ler string de conexão (connectionStrings) do arquivo Web.config Asp.Net MVC co C#(CSharp)
- Métodos de extensão C#
- MS SQL Server Express 2014 e Management Studio 2014 - Download e Intalação
- MySql e WorkBench - Download e Instalação
- Não consigo apagar um Banco de dados (can not drop database) - MS-SQL Server.
- Ordenando um array com o comando OrderBy C#(CSharp)
- Parar um loop foreach usando o comando break C#(CSharp).
- Protegendo seu site de ataques (CSRF ) com ValidateAntiForgeryToken Asp.Net MVC4 com C#(CSharp)
- Quando utilizar NOLOCK e READPAST no SqlServer.
- Recuperar a URL da página anterior em Asp.Net C# (CSharp)
- Recuperar a URL da página atual em Asp.Net C# (CSharp)
- Recuperar para código C# (CSharp) o valor de um componente de nossa página
- Restaurando um Banco de dados quando este fica travado informando estar restaurando, MS-SQL Server.
- Retorna o IP da conexão do Cliente em Asp.Net MVC com C# (CSharp)
- Retorna os dados do Navegador do Cliente em Asp.Net MVC com C# (CSharp)
- Rodando Script MS-SQL Server diretamente pela linha de comando
- Salvando CSV com cabeçalho no SQL Server Management Studio
- Separar String de caracteres C#(CSharp)
- Serilog e .NET Framework com C#
- Tipos de dados em C# (CSharp)
- Tipos de dados primitivos em C#(CSharp)
- Trabalhando com Cursores em MS-SQL Server.
- Tratando colunas nulas em sua Query MySql
- Tratando colunas nulas em sua Query SqlServer
- Update/Delete com INNER em MS-SQL Server
- Validando Valores nulos vindos de nosso Banco de Dados C#(CSharp)
- Validar Modelos com Data Annotation e Windows Form Application C#(CSharp)
- Verificar se uma string é um digito em C# (CSharp)
Comentários
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.