Il linguaggio Visual Basic di Microsoft
 

Nullable, Nothing e DbNull

Andrea (Work) 6 Lug 2016 12:25
Ciao a tutti,
mi trovo spesso a dover gestire dei campi delle classi che sono Nullable
es.
Property DataDimissione as Nullable(Of Date)

e gestirne lettura e scrittura da DB.

Per la lettura, la cosa migliore che ho trovato è stata questa

Dim dr as IDataReader
p.DataDimissione=If(dr.IsDBNull(9), New DateTime?, dr.GetDateTime(9))

All'inizio avevo messo nothing nel mezzo, ma sembra che vb.net lo
sostituisca con il valore di default del terzo membro, e quindi veniva una
data 0 ma non nothing.

C'è qualcosa di migliore? E' possibile estendere il datareader per fare una
cosa trasparente un po' come avviene con le stringhe?
Antologiko 6 Lug 2016 16:59
Non so cosa sia

p.DataDimissione

Ma dal codice postato mi verrebbe da dire che il comportamento indesiderato sia
dovuto al fatto che il tipo di dati di p.DataDimissione sia Date e non
Nullable(Of Date).
Andrea (Work) 8 Lug 2016 11:41
Il Wed, 6 Jul 2016 07:59:52 -0700 (PDT), Antologiko ha scritto:

> Non so cosa sia
>
> p.DataDimissione
>
> Ma dal codice postato mi verrebbe da dire che il comportamento
> indesiderato sia dovuto al fatto che il tipo di dati di p.DataDimissione
> sia Date e non Nullable(Of Date).

p.DataDimissione è l'istanza di un oggetto che ha come proprietà
DataDimissione nullable (Of Date)

Quando ci devo buttare il valore dal DB non posso fare l'associazione
diretta di DBNull in Nothing, perchè son due cose diverse.
Una soluzione è quella che ho scritto.

E cioè:
Dim dr as IDataReader
p.DataDimissione=If(dr.IsDBNull(9), New DateTime?, dr.GetDateTime(9))

Quella che avevo scritto ad occhio io la prima volta
p.DataDimissione=If(dr.IsDBNull(9), Nothing, dr.GetDateTime(9))
Invece fa si che il tipo dati restituito dall'IF sia un Date e non un
Nullable (Of Date).

Apparte questa cosa che comunque ho risolto, mi chiedevo se si poteva fare
qualche extension in modo da poter fare tipo

p.DataDimissione=dr.GetNullableDateTime(9)
Se nel DB c'è Dbnull.Value mi assegna nothing, altrimenti il valore.

Lo stesso problema c'è con tutti i tipi Value.
Antologiko 8 Lug 2016 15:37
> Apparte questa cosa che comunque ho risolto, mi chiedevo se si poteva fare
> qualche extension in modo da poter fare tipo
>
> p.DataDimissione=dr.GetNullableDateTime(9)
> Se nel DB c'è Dbnull.Value mi assegna nothing, altrimenti il valore.
>
> Lo stesso problema c'è con tutti i tipi Value.


Secondo me si.

Imports System.Runtime.CompilerServices

Module IDataReaderExtensions

<Extension()>
Public Function GetNullableDate(ByVal DR As IDataReader, Column As Integer)
As Nullable(Of Date)
If
DR.IsDBNull(Column) Then GetNullableDate = Nothing
Else
GetNullableDate = DR.GetDateTime(Column)
End If
End Sub
End Module
Andrea (Work) 13 Lug 2016 08:47
Il Fri, 8 Jul 2016 06:37:43 -0700 (PDT), Antologiko ha scritto:

> Secondo me si.
>
> Imports System.Runtime.CompilerServices
>
> Module IDataReaderExtensions
>
> <Extension()>
> Public Function GetNullableDate(ByVal DR As IDataReader, Column As
Integer) As Nullable(Of Date)
> If
> DR.IsDBNull(Column) Then GetNullableDate = Nothing
> Else
> GetNullableDate = DR.GetDateTime(Column)
> End If
> End Sub
> End Module

Grazie mille, sembra andare. Basta rifare i vari metodi e via.

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio Visual Basic di Microsoft | Tutti i gruppi | it.comp.lang.visual-basic | Notizie e discussioni visual basic | Visual basic Mobile | Servizio di consultazione news.