76 votes

traitement des données dbnull en vb.net

Je veux générer une sortie formatée de données extraites d'une base de données MS-Access et stockées dans un fichier de données. Table de données objet/variable, maDataTable. Cependant, certains des champs de myDataTable cotain dbNull données. Ainsi, l'extrait de code VB.net suivant donnera des erreurs si la valeur de l'un quelconque des champs nom de famille , intiales ou sID est dbNull .

   dim myDataTable as DataTable
   dim tmpStr as String
   dim sID as Integer = 1

   ...
   myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
   ...

   For Each myItem As DataRow In myDataTable.Rows

    tmpStr = nameItem("lastname") + " " + nameItem("initials")

    If myItem("sID")=sID Then
        ' Do something
    End If

    ' print tmpStr

   Next

Alors, comment faire pour que le code ci-dessus fonctionne lorsque les champs peuvent contenir dbNull sans avoir à vérifier à chaque fois si les données sont dbNull comme dans cette question ?

136voto

Mitchel Sellers Points 38352

Le seul moyen que je connaisse est de le tester, vous pouvez faire un test combiné pour faciliter les choses.

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

J'ai écrit en VB car c'est ce dont vous semblez avoir besoin, même si vous avez mélangé les langues.

Modifier

Nettoyé pour utiliser IsDbNull afin de le rendre plus lisible.

0 votes

Merci pour votre réponse. Je suppose que cela ressemble à un mélange de langages à cause de la façon dont j'ai codé les commentaires avec "//" au lieu de ticks pour les commentaires VB.net ?

0 votes

Yup ! Et le == dans la comparaison

0 votes

Je pense avoir corrigé le code dans la question pour qu'il soit du pur code VB.Net. Merci pour vos réponses.

34voto

Steve Wortham Points 11563

J'en ai eu assez de traiter ce problème et j'ai donc écrit une fonction NotNull() pour me dépanner.

Public Shared Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T
        If Value Is Nothing OrElse IsDBNull(Value) Then
                Return DefaultValue
        Else
                Return Value
        End If
End Function

Utilisation :

If NotNull(myItem("sID"), "") = sID Then
  ' Do something
End If

Ma fonction NotNull() a subi quelques remaniements au fil des ans. Avant les génériques, je spécifiais simplement tout en tant qu'objet. Mais je préfère de loin la version Generic.

2 votes

+1 Fonctionne très bien, je l'ai nommé IsNull() comme pour SQL Server.

5 votes

Je préfère rendre la 2ème variable optionnelle afin que la signature soit comme ceci : Public Shared Function NotNull(Of T)(ByVal Value As T, Optional ByVal DefaultValue As T = Nothing) As T et il peut être appelé comme If NotNull(myItem("sID")) = sID Then ou comme indiqué ci-dessus.

0 votes

Cela ne fonctionne pas pour moi avec VS 2008 : j'ai essayé d'utiliser cette méthode avec un dataset généré dataTable et cela n'a pas fonctionné. NotNull(rw.computer) échoue parce que le code Dataset.Designer.vb tente de convertir en chaîne de caractères avant de la transmettre comme argument. Je suppose que cela fonctionnerait avec des DataTable génériques.

10voto

Mitchel Sellers Points 38352

Vous pouvez également utiliser les méthodes Convert.ToString() et Convert.ToInteger() pour convertir efficacement les éléments avec DB null.

6voto

Greg May Points 31

Une variation du code de Steve Wortham, à utiliser nominalement avec les types nullables :

    Private Shared Function GetNullable(Of T)(dataobj As Object) As T
        If Convert.IsDBNull(dataobj) Then
            Return Nothing
        Else
            Return CType(dataobj, T)

        End If

    End Function

par exemple

     mynullable = GetNullable(Of Integer?)(myobj)

Vous pouvez alors interroger mynullable, par exemple mynullable.HasValue.

3voto

Christian Hayter Points 17999

Microsoft a créé DBNull dans .NET 1.0 pour représenter les NULL des bases de données. Cependant, il est très difficile à utiliser car il est impossible de créer une variable fortement typée pour stocker une valeur réelle ou un null. Microsoft a en quelque sorte résolu ce problème dans la version 2.0 de .NET avec les types nullables. Cependant, vous êtes toujours coincé avec de grandes parties de l'API qui utilisent DBNull, et elles ne peuvent pas être modifiées.

C'est juste une suggestion, mais ce que je fais normalement est ceci :

  1. Toutes les variables contenant des données lues ou écrites dans une base de données doivent être capables de gérer les valeurs nulles. Pour les types de valeurs, cela signifie les rendre Nullable(Of T). Pour les types de référence (String et Byte()), cela signifie permettre à la valeur d'être Nothing.
  2. Écrivez un ensemble de fonctions pour convertir les allers-retours entre "objet pouvant contenir DBNull" et "variable .NET nullable". Enveloppez tous les appels aux API de type DBNull dans ces fonctions, puis faites comme si DBNull n'existait pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X