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 ?
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
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.
Vous pouvez également utiliser les méthodes Convert.ToString () et Convert.ToInteger () pour convertir des éléments avec DB null de manière efficace.
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
)
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:
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
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.
Vous pouvez utiliser la fonction IsDbNull:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
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
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"))
Bonjour amis
C'est la méthode la plus courte pour vérifier db Null dans DataGrid et convertir en chaîne