TRATAR NULL VB.NET

DUMMIES 09/02/2016 20:09:59
#457405
Prezados.
Tenho um consulta no banco de dados e ora um ou outro campo retorna com null,o que é bem natural. E estou tratando da seguinte maneira:

If Not rd.IsDBNull(rd.GetOrdinal([Ô]logradouro[Ô])) Then
txtLogradouro.Text = rd.GetString([Ô]logradouro[Ô]).ToString
Else
txtLogradouro.Text = String.Empty
End If

Isso dá certo, mas to achando muito [Ô]Trabalhoso[Ô], pois tenho consultas com mais de 15 campos a serem preenchidos e praticamente repito isso para todos eles.
Alguém tem uma ideia melhor para tratar NULL quando vindo de uma consulta no banco de dados?
Sei que seria mais fácil tratar diretamente no SELECT, mas prefiro fazer isso no código.

Obrigado !
MOUSER 09/02/2016 22:24:59
#457408
O Null é tratado para a mesma tabela? Você pode criar uma Sub e chamar ela, por exemplo:
Public Sub Null1()
If Not rd.IsDBNull(rd.GetOrdinal([Ô]logradouro[Ô])) Then
txtLogradouro.Text = rd.GetString([Ô]logradouro[Ô]).ToString
Else
txtLogradouro.Text = String.Empty
End If
End Sub

Ao executar alguma verificação, ao invés de digitar todo esse código toda vez que precisar usa - lo, basta chamar o Null1() que ele fara isso pra você!
KERPLUNK 09/02/2016 22:45:53
#457409
Resposta escolhida
Use um método de extensão, que além de tratar null, ainda elimina o uso dos [Ô]GetOrdinal[Ô]:

<System.Runtime.CompilerServices.Extension> _
Public Shared Function SafeGetString(reader As SqlDataReader, coluna As String) As String
If Not reader.IsDBNull(colIndex) Then
Return reader.GetString(reader.GetOrdinal(colIndex))
Else
Return String.Empty
End If
End Function


Agora o método [Ô]SafeGetString[Ô] pode ser chamado à partir de qualquer classe que implemente IDataReader. Este método é para campos do tipo String(Varchar), portanto para outros métodos como GetInt32, GetDouble, GetDate e etc, métodos correspondentes podem ser criados e eles também estarão disponíveis para seu DataReader. Para usar é algo como:

txtCliente.Text = SqlReader.SafeGetString([Ô]NomeCliente[Ô])
DUMMIES 10/02/2016 08:43:37
#457415
Mouser e Kerplunk, obrigado pelo retorno.
Vou testar aqui e depois dou um retorno para vocês, mas valeu pela ajuda !


[]s
DUMMIES 10/02/2016 22:22:02
#457456
Kerplunk.
Optei pelo exemplo que me enviou e deu certinho, fiz uma pequena alteração declarando a variável colIndex conforme segue abaixo. Caso esteja errado me corrija por favor.

<System.Runtime.CompilerServices.Extension> _
Public Function SafeGetString(reader As MySqlDataReader, coluna As String) As String

Dim colIndex As Integer = reader.GetOrdinal(coluna)

If Not reader.IsDBNull(colIndex) Then
Return reader.GetString(reader.GetOrdinal(colIndex))
Else
Return String.Empty
End If

End Function
KERPLUNK 10/02/2016 22:50:57
#457457
Está certinho. Agora, você pode usar esse método em qualquer DataReader ou classe que implemente IDataReader. Você pode também fazer métodos para cada tipo de dados, esse é para string, mas você pode fazer para integer, double, datetime ou qualquer outro numa boa e usando praticamente o mesmo código. Métodos de extensão tem um poder que só depois que começamos à usar que percebemos. Eu uso vários deles, incluindo métodos para trabalhar com XML e JSON. Serializa e desserializa, tanto de string como de arquivos e chamadas de WebAPI. O bacana é que com isso, basta eu criar a classe, implementar os métodos e pronto, trabalho com JSON e XML de boa sem stress.
DAMASCENO.CESAR 11/02/2016 09:47:00
#457475
Aproveitando a deixa RSRS,
KERPLUNK, funciona também com data do MySQL?
DAMASCENO.CESAR 11/02/2016 09:49:00
#457476
Ops, foi mal, não prestei atenção direito, cancela minha pergunta, pois meu problema é na hora de passar data com valor null pro DataReader, mas isso já arrumei rsrsrs
Tópico encerrado , respostas não são mais permitidas