Classe para tratar valores nulos vindos de nossa Query SQL, C#(CSharp).
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
- Arquitetura CQRS
- Arrays em 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 Ler e Gravar Cookies - Asp.Net MVC 4 com C# (CSharp)
- Classes anônimas em C#(CSharp)
- Comando nameof() C#(CSharp)
- Compare duas strings ignorando maiúsculas e minúsculas C#(CSharp).
- Consulta SQLServer com paginação
- Criar Classes Dinâmicas usando DynamicObject e ExpandoObject em C# (CSharp)
- 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)
- 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
- Explorando Tipos de Dados Personalizados no SqlServer: Utilidade e Impacto na Performance
- Extensões para DataReader, tratando valores de suas consultas SQL (DataReaderExtensions) C#(CSharp)
- Formatar CEP em C# (CSharp)
- Função para devolver data do próximo dia da semana informado C#(CSharp).
- 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
- Ler string de conexão (connectionStrings) do arquivo Web.config Asp.Net MVC co C#(CSharp)
- Métodos de extensão C#
- Ordenando um array com o comando OrderBy C#(CSharp)
- Parar um loop foreach usando o comando break C#(CSharp).
- 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
- 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)
- 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)
- 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)