web-dev-qa-db-fra.com

traitement des données dbnull dans vb.net

Je souhaite générer une sortie formatée de données extraites d'une base de données MS-Access et stockées dans un objet/variable DataTable, myDataTable. Cependant, certains champs de myDataTable cotain dbNull data. Ainsi, l'extrait de code VB.net suivant générera des erreurs si la valeur de l'un des champs nom, 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 puis-je obtenir le code ci-dessus pour fonctionner lorsque les champs peuvent contenir dbNull sans avoir à vérifier chaque fois si les données sont dbNull comme dans cette question ?

72
Azim

Le seul moyen que je connaisse est de le tester, vous pouvez combiner si facilement.

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 avez besoin, même si vous avez mixé plusieurs langues.

Éditer

Nettoyé pour utiliser IsDbNull pour le rendre plus lisible

128
Mitchel Sellers

J'étais fatigué 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

Usage:

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

Ma fonction NotNull () a subi plusieurs révisions au fil des ans. Avant Generics, je spécifiais simplement tout comme un objet. Mais je préfère de loin la version générique.

33
Steve Wortham

Vous pouvez également utiliser les méthodes Convert.ToString () et Convert.ToInteger () pour convertir des éléments avec DB null de manière efficace.

8
Mitchel Sellers

Une variation sur code de Steve Wortham , à utiliser nominalement avec les types nullable:

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 ensuite interroger mynullable (par exemple, mynullable.HasValue)

5
Greg May

Microsoft a proposé DBNull dans .NET 1.0 pour représenter la base de données NULL. Toutefois, il est difficile d’utiliser cette dernière car vous ne pouvez pas créer de variable fortement typée pour stocker une valeur réelle ou nulle. Microsoft a en quelque sorte résolu ce problème dans .NET 2.0 avec des types nullables. Cependant, vous êtes toujours bloqué avec de gros morceaux d'API qui utilisent DBNull, et ils ne peuvent pas être modifiés.

Juste une suggestion, mais ce que je fais normalement est la suivante:

  1. Toutes les variables contenant des données lues ou écrites dans une base de données doivent pouvoir gérer des valeurs nulles. Pour les types de valeur, cela signifie les rendre Nullables (Of T). Pour les types de référence (String et Byte ()), cela signifie que la valeur doit être Nothing.
  2. Ecrivez un ensemble de fonctions à convertir entre "objet pouvant contenir DBNull" et "variable .NET nullable". Emballez tous les appels aux API de style DBNull dans ces fonctions, puis prétendez que DBNull n'existe pas.
3
Christian Hayter

Si vous utilisez une configuration BLL/DAL, essayez l’iif lors de la lecture de 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
John B

Pour les lignes contenant des chaînes, je peux les convertir en chaînes comme dans la modification

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

à

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

Pour la comparaison dans l'instruction ifmyItem ("sID" sID) ==, il doit être remplacé par

myItem("sID").Equals(sID)

Ensuite, le code s'exécutera sans aucune erreur d'exécution due à vbNull data.

1
Azim

Vous pouvez utiliser la fonction IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If
1
brendan
   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

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

sélectionnez ISNULL (somme (champ), 0) à partir de nomtable

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

0
Sabbir Hassan

C'est PAR FAR le moyen le plus simple de convertir DBNull en chaîne. Le truc, c'est que vous NE POUVEZ PAS utiliser la fonction TRIM (qui était mon problème initial) pour faire référence aux champs de la base de données:

AVANT (msg erreur produite):

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
user3284874

Bonjour amis

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

  1. créer l'événement de validation de cellule et écrire ce code
  2. Si Convert.ToString (dgv.CurrentCell.Value) = "" Alors
  3. CurrentCell.Value = ""
  4. Fin si
0
JAY SINGH