2010-09-07 8 views
1

J'ai tendance à utiliserJ'ai tendance à utiliser If IsDBNull (dr ("data")) Alors ... pour lire à partir d'un lecteur de données, y at-il un meilleur moyen?

If Not IsDBNull(dr("data")) Then 
    myData = dr("data") 
End If 

pour attraper des valeurs nulles. Y a-t-il un meilleur moyen? Il semble que je l'utilise encore et encore? Toute personne écrire une fonction pour vérifier quelque chose comme

mydata = IfNotNull("data") 

Je ne sais pas comment gérer les différents types de données qui pourraient être retournés. Merci pour vos commentaires!

Répondre

4

Dans les cas où mon objet CLR est annulable, quand j'utilisais VB.NET j'ai utilisé cette méthode d'extension:

Private Function GetNullable(Of T As Structure)(ByVal row As System.Data.DataRow, ByVal fieldname As String, ByVal convert As Conversion(Of T)) As Nullable(Of T) 
     Dim nullable As Nullable(Of T) 
     If System.Convert.IsDBNull(row(fieldname)) Then 
      nullable = Nothing 
     Else 
      nullable = convert(row, fieldname) 
     End If 
     Return nullable 
    End Function 

Avec le délégué suivant pour Conversion(Of T):

Private Delegate Function Conversion(Of T)(ByVal row As System.Data.DataRow, ByVal fieldname As String) As T 

Je puis couche sur les extensions pour les types de données pertinents:

<Extension()> _ 
    Public Function GetDouble(ByVal row As System.Data.DataRow, ByVal name As String) As Double 
     Return Convert.ToDouble(row(name)) 
    End Function 

    <Extension()> _ 
    Public Function GetNullableDouble(ByVal row As System.Data.DataRow, ByVal name As String) As System.Nullable(Of Double) 
     Return GetNullable(Of Double)(row, name, AddressOf GetDouble) 
    End Function 

Enfin, je peux utiliser:

Dim amount As Double? = dr.GetNullableDouble("amount") 
+0

Génial! c'est exactement ce dont j'avais besoin! Et m'a présenté quelques nouveaux concepts pour envelopper mon cerveau! Merci en effet! – mellerbeck

+0

Ok, une question. Je n'ai pas pu utiliser ceci avec DR.GetNullableDouble? est-ce parce qu'il devrait étendre sqlclient.sqldatareader ?? – mellerbeck

+0

Oui, j'aurais dû fournir un exemple qui étend sqldatareader pour cet exemple. Je vais éditer quand j'ai le temps. – Larsenal