traitement des données dbnull 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 DataTable objet/variable, myDataTable. Cependant, certains des champs dans les données mydatatable cotain dbNull . Donc, le suivant VB.net l'extrait de code donnera des erreurs si la valeur de l'un des champs lastname , intials , 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 fonctionner le code ci-dessus alors que les champs peuvent contenir dbNull sans avoir à vérifier à chaque fois si les données sont dbNull comme dans cette question ?

66
demandé sur Community 2008-10-21 22:03:08

12 réponses

Le seul moyen que je connaisse est de tester pour cela, vous pouvez faire un combiné si pour le rendre facile.

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

j'ai écrit dans VB car c'est ce dont vous avez besoin, même si vous avez mélangé les langues.

Modifier

nettoyé pour utiliser IsDbNull pour le rendre plus lisible""

118
répondu Mitchel Sellers 2008-10-21 18:07:57

j'en ai eu assez de traiter ce problème alors j'ai écrit une fonction NotNull() pour m'aider.

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

Mon NotNull() la fonction a disparu à travers un couple de révisions au fil des ans. Avant les génériques, j'ai simplement spécifié tout comme un objet. Mais je préfère de beaucoup la version Générique.

32
répondu Steve Wortham 2009-11-12 17:15:24

vous pouvez également utiliser le Convert.ToString() et de les Convertir.Les méthodes ToInteger () pour convertir efficacement les éléments avec DB null.

8
répondu Mitchel Sellers 2008-10-21 18:09:57

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

    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

p.ex.

     mynullable = GetNullable(Of Integer?)(myobj)

vous pouvez alors interroger mynullable par exemple mynullable.HasValue

5
répondu Greg May 2012-03-31 05:52:58

Microsoft a créé DBNull dans .NET 1.0 pour représenter la base de données NULL. Cependant, c'est une douleur dans le derrière à utiliser parce que vous ne pouvez pas créer une variable fortement dactylographiée pour stocker une valeur authentique ou null. Microsoft a en quelque sorte résolu ce problème dans .NET 2.0 avec les types nullables. Cependant, vous êtes toujours coincé avec de grands morceaux D'API qui utilisent DBNull, et ils ne peuvent pas être changés.

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

  1. Toutes les variables contenant des données lues ou écrites à une base de données doit être capable de gérer les valeurs null. Pour les types de valeurs, cela signifie les rendre nulles(de T). Pour les types de référence (String et Byte()), cela signifie que la valeur est nulle.
  2. Écrire un ensemble de fonctions pour convertir de va-et-vient entre "objet qui peut contenir DBNull" et "variable .net nullable". Envelopper tous les appels à des API de style DBNull dans ces fonctions, puis prétendre que DBNull n'existe pas.
3
répondu Christian Hayter 2009-06-07 13:30:15

si vous utilisez une configuration BLL / DAL essayez l'iif en lisant dans l'objet dans le DAL

While reader.Read()
 colDropdownListNames.Add(New DDLItem( _
 CType(reader("rid"), Integer), _
 CType(reader("Item_Status"), String), _
 CType(reader("Text_Show"), String), _
 CType( IIf(IsDBNull(reader("Text_Use")), "", reader("Text_Use")) , String), _
 CType(reader("Text_SystemOnly"), String), _
 CType(reader("Parent_rid"), Integer)))
End While
2
répondu John B 2012-09-05 12:25:03

vous pouvez utiliser la fonction IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If
1
répondu brendan 2008-10-21 18:08:41

pour les lignes contenant des chaînes, je peux les convertir en chaînes comme en changeant

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

à

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

pour la comparaison dans le si déclaration myItem ("sID")=sID , il doit être remplacé par

myItem("sID").Equals(sID)

alors le code s'exécute sans aucune erreur d'exécution due aux données vbNull .

1
répondu Azim 2008-10-21 18:14:05
   VB.Net
   ========
    Dim da As New SqlDataAdapter
    Dim dt As New DataTable
    Call conecDB()        'Connection to Database
    da.SelectCommand = New SqlCommand("select max(RefNo) from BaseData", connDB)

    da.Fill(dt)

    If dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) = "" Then
        MsgBox("datbase is null")

    ElseIf dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) <> "" Then
        MsgBox("datbase have value")

    End If
1
répondu BINU NARAYANAN NELLIYAMPATHI 2013-11-27 15:40:40

Bonjour Les Amis

c'est la méthode la plus courte pour vérifier db Null dans DataGrid et convertir en chaîne

  1. créer la cellule validation de l'événement et écrire ce code
  2. Si Converti.ToString (dgv.CurrentCell.Valeur) = ""Puis
  3. CurrentCell.Valeur = ""
  4. End If
0
répondu JAY SINGH 2013-08-11 10:10:41

C'est de loin la façon la plus facile de convertir DBNull en chaîne. L'astuce est que vous ne peut pas utiliser la fonction TRIM (qui était mon problème initial) en se référant aux champs de la base de données:

avant (erreur produite msg):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

après (plus d'Erreur msg : -)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
0
répondu user3284874 2016-04-07 07:06:06

je pense que cela devrait être beaucoup plus facile à utiliser:

sélectionner ISNULL(sum (field),0) à partir de tablename

copié de: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ

0
répondu Sabbir Hassan 2016-09-26 20:33:43