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 ?

War es hilfreich?

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:

  1. 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.
  2. 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
  1. Erstellen Sie die Zelle Validierung Ereignis und schreiben diesen Code
  2. Wenn Convert.ToString (dgv.CurrentCell.Value) = "" Then
  3. CurrentCell.Value = ""
  4. 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top