Umgang mit dbnull-Daten in vb.net

75

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 ?

Azim
quelle

Antworten:

134

Die einzige Möglichkeit, die ich kenne, besteht darin, sie zu testen. Sie können eine Kombination durchführen, wenn dies einfach ist.

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

Ich habe in VB geschrieben, da es so aussieht, als ob Sie es brauchen, obwohl Sie Sprachen gemischt haben.

Bearbeiten

Bereinigt, um IsDbNull zu verwenden, um es besser lesbar zu machen

Mitchel Sellers
quelle
Danke für deine Antwort. Ich denke, es sieht aus wie gemischte Sprachen, weil ich die Kommentare mit "//" anstelle von Häkchen für VB.net-Kommentare codiert habe.
Azim
Jep! Und die == im Vergleich
Mitchel Sellers
Ich glaube, ich habe den Code in der Frage so korrigiert, dass er reiner VB.Net-Code ist. Danke für deine Antworten.
Azim
10 Jahre später. "+" auch. : P
Johnny Prescott
Die DataRowKlasse hat eine eigene IsNullMethode. Dieser Code würde auch nicht mit kompiliert Option Strict On.
jmcilhinney
34

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.

Steve Wortham
quelle
2
+1 Funktioniert sehr gut, ich habe es IsNull () gemäß SQL Server genannt.
Lazlow
5
Ich bevorzuge es, die 2. Variable optional zu machen, damit die Signatur wie folgt lautet: Public Shared Function NotNull(Of T)(ByVal Value As T, Optional ByVal DefaultValue As T = Nothing) As Tund sie kann wie If NotNull(myItem("sID")) = sID Thenoder wie oben aufgeführt aufgerufen werden .
Daniel
Funktioniert bei VS 2008 nicht: Ich habe versucht, diese Methode mit einer vom Dataset generierten dataTable zu verwenden, und habe nicht funktioniert. 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.
D_Bester
Fügen Sie dies ein, wenn Sie nullable of integer verwenden: Öffentliche Funktion NotNull (ByVal-Wert als Ganzzahl?) Als Ganzzahl Rückgabe NotNull (Wert, 0) Endfunktion
Richard Griffiths
Ich liebe diese Methode. Prägnant und effektiv. +1
Jessica
9

Sie können auch die Methoden Convert.ToString () und Convert.ToInteger () verwenden, um Elemente mit DB null effektiv zu konvertieren.

Mitchel Sellers
quelle
6

Eine Variation von Steve Worthams Code , die nominell für nullableTypen 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(zB mynullable.HasValue)

Greg May
quelle
3

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:

  1. Alle Variablen, die Daten enthalten, die aus einer Datenbank gelesen oder in diese geschrieben wurden, sollten mit Nullwerten umgehen können. Für Werttypen bedeutet dies, sie auf Null zu setzen (von T). Für Referenztypen (String und Byte ()) bedeutet dies, dass der Wert Nothing sein darf.
  2. Schreiben Sie eine Reihe von Funktionen zum Konvertieren zwischen "Objekt, das möglicherweise DBNull enthält" und "nullfähige .NET-Variable". Schließen Sie alle Aufrufe von APIs im DBNull-Stil in diese Funktionen ein und tun Sie dann so, als ob DBNull nicht vorhanden wäre.
Christian Hayter
quelle
2

Sie können die IsDbNull-Funktion verwenden:

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

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
John B.
quelle
1

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.

Azim
quelle
1
   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
BINU NARAYANAN NELLIYAMPATHI
quelle
0

Hallo Freunde

Dies ist die kürzeste Methode, um db Null in DataGrid zu überprüfen und in einen String zu konvertieren

  1. Erstellen Sie das Zellenvalidierungsereignis und schreiben Sie diesen Code
  2. Wenn Convert.ToString (dgv.CurrentCell.Value) = "" Dann
  3. CurrentCell.Value = ""
  4. End If
JAY SINGH
quelle
0

Dies ist bei weitem der einfachste Weg, um DBNullin einen String zu konvertieren . Der Trick ist, dass Sie die Funktion (die mein ursprüngliches Problem war) NICHT verwenden können, TRIMwenn 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"))
user3284874
quelle