Question

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 contiennent des données dbNull . Ainsi, l'extrait de code VB.net suivant donnera des erreurs si la valeur de l'un des champs nom , initiales 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 ?

Était-ce utile?

La solution

Le seul moyen que je connaisse est de le tester, vous pouvez effectuer un test combiné si cela vous facilite la tâche.

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 mélangez les langues.

Modifier

Nettoyé pour utiliser IsDbNull pour le rendre plus lisible

Autres conseils

J'en avais marre de régler ce problème, j'ai donc é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

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

Vous pouvez également utiliser les méthodes Convert.ToString () et Convert.To Integer () pour convertir efficacement des éléments avec DBnull.

Variation sur les 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 )

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 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 changés.

Juste une suggestion, mais ce que je fais habituellement 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 NULL. 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 en "objet pouvant contenir DBNull" et "variable .NET nullable". Emballez tous ces appels vers les API de style DBNull dans ces fonctions, puis prétendez que DBNull n’existe pas.

Si vous utilisez une configuration BLL / DAL, essayez 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

Vous pouvez utiliser la fonction IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

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 if myItem ("sID") = sID , il faut remplacer

par

.
myItem("sID").Equals(sID)

Ensuite, le code s'exécutera sans erreur d'exécution à cause des données vbNull .

   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

Bonjour les amis

Il s'agit de la méthode la plus courte pour vérifier db Null dans DataGrid et convertir en chaîne

  1. créez l'événement de validation de cellule et écrivez ce code
  2. If Convert.ToString (dgv.CurrentCell.Value) = "" Puis
  3. CurrentCell.Value = ""
  4. Fin si

C’est BY 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) lorsque vous vous référez aux champs de la base de données:

AVANT (message d'erreur généré):

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

APRÈS (plus de message d'erreur :-)):

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

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

  

sélectionnez ISNULL (somme (champ), 0) dans le nom du fichier

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top