Umgang mit DBNull Daten in vb.net
Frage
Ich mag einige formatierte Ausgabe von Daten aus einer MS-Access-Datenbank gespeichert und in einem Datatable Objekt / variabel, MyDataTable abgerufen erzeugen. Doch einige der Felder in MyDataTable cotain DBNULL Daten. So wird der folgende VB.net Code-Schnipsel Fehler geben, wenn der Wert eines der Felder Nachname 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
Also, wie kann ich den obigen Code zu arbeiten, wenn die Felder enthalten DBNULL , ohne jedes Mal zu überprüfen, die, wenn die Daten DBNULL wie in diese Frage ?
Lösung
Die einzige Möglichkeit, die ich kenne, dafür zu testen, können Sie eine Kombination aus tun, wenn, obwohl es leicht zu machen.
If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
'Do success
ELSE
'Failure
End If
ich in VB geschrieben, wie das ist, was es sieht aus wie Sie brauchen, auch wenn Sie gemischte Sprachen.
Bearbeiten
Aufgeräumt IsDBNull zu verwenden, um es besser lesbar
Andere Tipps
Ich habe müde mit diesem Problem umzugehen, damit ich eine NotNull () Funktion schreibe 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
Verbrauch:
If NotNull(myItem("sID"), "") = sID Then
' Do something
End If
Meine NotNull () Funktion wird durch ein paar Überholungen im Laufe der Jahre verschwunden. Vor Generics, ich angegeben einfach alles als Objekt. Aber ich viel lieber die generische Version.
Sie können auch die Convert.ToString () und Convert.To Integer () Methoden verwenden, um Produkte mit DBNULL zu konvertieren effektiv.
Eine Variante Steve Wortham Code , verwendet werden nominell mit nullable
Typen:
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.
mynullable = GetNullable(Of Integer?)(myobj)
Sie können dann abfragen mynullable
(zum Beispiel mynullable.HasValue
)
Microsoft kam mit DBNull in .NET 1.0 bis zu Datenbank NULL darstellen. Aber es ist ein Schmerz in den Hintern zu verwenden, da Sie nicht erstellen können, stark typisierte Variablen einen echten Wert oder null zu speichern. Microsoft gelöst Art, dieses Problem in .NET 2.0 mit Nullable-Typen. Sie sind jedoch nach wie vor mit großen Stücken von API stecken, die DBNull verwenden, und sie können nicht geändert werden.
Nur ein Vorschlag, aber was ich normalerweise tun, ist dies:
- Alle Variablen Daten gelesen oder geschrieben in einer Datenbank enthalten, sollten NULL-Werte zu handhaben können. Für Werttypen bedeutet dies, sie Nullable (Of T) zu machen. Für Referenztypen (String und Byte ()), bedeutet dies, der Wert so dass nichts sein.
- eine Reihe von Funktionen schreiben hin und her zwischen „Objekt, das DBNull enthalten kann“ konvertieren und „Nullable-.NET-Variable“. Wickeln Sie alle Anrufe an DBNull-Stil APIs in diesen Funktionen, so tun, als ob DBNull nicht existiert.
Wenn Sie eine BLL / DAL-Setup versuchen, das iif verwenden, wenn in der DAL in das Objekt zu lesen
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
Sie können die IsDBNull-Funktion:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
Für die Zeilen Zeichenketten enthalten, kann ich sie in Strings umwandeln, wie in Ändern
tmpStr = nameItem("lastname") + " " + nameItem("initials")
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
Für den Vergleich in der , wenn Aussage myItem ( "sID") = sID , muss es ändern sein
myItem("sID").Equals(sID)
Dann läuft der Code ohne Laufzeitfehler aufgrund vbNull Daten.
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
Hallo Freunde
Dies ist die kürzeste Methode db Null in Datagrid zu überprüfen und String
konvertieren- Erstellen Sie die Zelle Validierung Ereignis und schreiben diesen Code
- Wenn Convert.ToString (dgv.CurrentCell.Value) = "" Then
- CurrentCell.Value = ""
- End If
Dies ist BY FAR der einfachste Weg, DBNull
in eine Zeichenfolge zu konvertieren.
Der Trick ist, dass Sie kann nicht verwenden, um die TRIM
Funktion (das mein erstes Problem war), wenn auf die Felder aus der Datenbank verweisen:
Vor (erzeugt Fehler msg):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))
nach (nicht mehr Fehler msg :-)):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
Ich denke, das sollte viel einfacher zu bedienen sein:
select ISNULL (sum (Feld), 0) von Tabellennamen
Kopiert von: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ