Ich möchte eine formatierte Ausgabe von Daten generieren, die aus einer MS-Access-Datenbank abgerufen und in einem DataTable- Objekt / einer DataTable- Variablen, myDataTable, gespeichert wurden. Einige der Felder in myDataTable enthalten jedoch dbNull- Daten. So wird der folgende VB.net Code - Schnipsel Fehler geben , wenn der Wert eines der Felder Nachnamen , intials oder sID ist 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
Wie kann ich den obigen Code zum Laufen bringen , wenn die Felder möglicherweise dbNull enthalten, ohne jedes Mal überprüfen zu müssen, ob die Daten wie in dieser Frage dbNull sind ?
DataRow
Klasse hat eine eigeneIsNull
Methode. Dieser Code würde auch nicht mit kompiliertOption Strict On
.Ich hatte es satt, mich mit diesem Problem zu befassen, und schrieb eine NotNull () - Funktion, um mir zu helfen.
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
Verwendung:
If NotNull(myItem("sID"), "") = sID Then ' Do something End If
Meine NotNull () -Funktion wurde im Laufe der Jahre einige Male überarbeitet. Vor Generics habe ich einfach alles als Objekt angegeben. Aber ich bevorzuge die generische Version.
quelle
Public Shared Function NotNull(Of T)(ByVal Value As T, Optional ByVal DefaultValue As T = Nothing) As T
und sie kann wieIf NotNull(myItem("sID")) = sID Then
oder wie oben aufgeführt aufgerufen werden .NotNull(rw.computer)
schlägt fehl, weil der Code Dataset.Designer.vb versucht, in einen String zu konvertieren, bevor er als Argument übergeben wird. Ich nehme an, es würde mit generischer DataTable funktionieren.Sie können auch die Methoden Convert.ToString () und Convert.ToInteger () verwenden, um Elemente mit DB null effektiv zu konvertieren.
quelle
Eine Variation von Steve Worthams Code , die nominell für
nullable
Typen verwendet werden soll: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
z.B
mynullable = GetNullable(Of Integer?)(myobj)
Sie können dann abfragen
mynullable
(zBmynullable.HasValue
)quelle
Microsoft hat DBNull in .NET 1.0 entwickelt, um die Datenbank NULL darzustellen. Die Verwendung ist jedoch schwierig, da Sie keine stark typisierte Variable zum Speichern eines echten Werts oder einer Null erstellen können. Microsoft hat dieses Problem in .NET 2.0 mit nullbaren Typen gelöst. Sie stecken jedoch immer noch in großen API-Blöcken fest, die DBNull verwenden, und sie können nicht geändert werden.
Nur ein Vorschlag, aber was ich normalerweise mache, ist Folgendes:
quelle
Sie können die IsDbNull-Funktion verwenden:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then // Do something End If
quelle
Wenn Sie ein BLL / DAL-Setup verwenden, versuchen Sie es mit dem iif, wenn Sie das Objekt in der DAL einlesen
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
quelle
Für die Zeilen, die Zeichenfolgen enthalten, kann ich sie wie beim Ändern in Zeichenfolgen konvertieren
tmpStr = nameItem("lastname") + " " + nameItem("initials")
zu
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
Für den Vergleich in der if- Anweisung myItem ("sID") = sID muss in geändert werden
myItem("sID").Equals(sID)
Dann wird der Code ohne Laufzeitfehler aufgrund von vbNull- Daten ausgeführt.
quelle
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
quelle
Hallo Freunde
Dies ist die kürzeste Methode, um db Null in DataGrid zu überprüfen und in einen String zu konvertieren
quelle
Dies ist bei weitem der einfachste Weg, um
DBNull
in einen String zu konvertieren . Der Trick ist, dass Sie die Funktion (die mein ursprüngliches Problem war) NICHT verwenden können,TRIM
wenn Sie auf die Felder aus der Datenbank verweisen:VORHER (erzeugte Fehlermeldung):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))
NACH (keine Fehlermeldung mehr :-)):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
quelle
Ich denke, das sollte viel einfacher zu bedienen sein:
Kopiert von: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ
quelle