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 ?
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""
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.
vous pouvez également utiliser le Convert.ToString() et de les Convertir.Les méthodes ToInteger () pour convertir efficacement les éléments avec DB null.
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
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:
- 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.
- É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.
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
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 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 .
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
c'est la méthode la plus courte pour vérifier db Null dans DataGrid et convertir en chaîne
- créer la cellule validation de l'événement et écrire ce code
- Si Converti.ToString (dgv.CurrentCell.Valeur) = ""Puis
- CurrentCell.Valeur = ""
- End If
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"))
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