DevTrain

Autor: Hannes Preishuber

Null und Nichts in .NET

Was ist wenn nichts ist? Eigentlich doch kein Problem oder? Mitnichten!

Das Handling von Null Werten ist in .NET mit ein paar Haken und Ösen versehen.

Objekte
Wenn ein Objekt dimensioniert ist, aber keine Instanz erzeugt ist, ist dies nichts. Nicht wird in diesem Falle durch nothing repäsentiert. Ein Vergleich mit Nothing ist zulässig. Alternativ gibts auch die Funktion isnothing()
Dim myobj as object
if myob=nothing then ....
if isnothing(myobj) then ...

Null in Database
Kompliziert wird es erst wenn in Tabellen Felder Null Werte zulassen. Hier ist der Vergleich  mit nothing nicht zulässig. Es gibt allerdings einen eigenen Datentyp für diesen Zweck: DBNull. Wenn Sie also mit einem Datareader auf ein Feld zugreifen indem nichts steht, wird im Direkt Fenster von Visual Studio folgendes ausgegeben.

?DR.Item("company")
{System.DBNull}

Zum Problem wird dies, wenn Sie diesen Wert einer Textbox zwecks Anzeige zuweisen wollen. Zunächst können Sie über cstr oder CType sicherstellen, das auch ein String geliefert wird.
txtCompany.Text = CStr(DR.Item("company"))

Wenn aber ein NUll in der Datenbank steht wird Ihnen folgende Fehlermeldung um die Ohren fliegen.

Cast from type 'DBNull' to type 'String' is not valid.

Auch ein CType hilft nicht.
txtName.Text = CType(DR.Item("name"), String)

    
Einzig mit der Funtkion isDBNULL lässt sich feststellen ob das Feld Null enthält. Dazu muss einmal iSDBNull aufgerufen werden und dann noch der eigentliche Wert geholt werden.
If IsDBNull(DR.Item("company")) = False Then
            txtCompany.Text = CType(DR.Item("company"), String)
End If

Noch viel härter ist das zuweisen von Null Werten. Zunächst ganz einfach mit dem Datentyp das Feld beschreiben.

Zuweisen
r("FirstName") = System.DBNull.Value

Was aber wenn die Daten aus einem Eingabeformular kommen? Dann soll wenn in der Textbox nichts steht auch Null in das Feld. In diesem Beispiel verwenden wir einen Stringbuilder für das zusammenstellen des SQL Kommandos. Für jedes Feld muss folgender Codeblock eingebaut werden.

....
If txtName.Text = "" Then
            SQL.Append("name = null")
        Else
            SQL.Append("name='")
            SQL.Append(txtName.Text)
            SQL.Append("'")

End If

An dieser Stelle kann nur empfohlen werden andere Wege zu gehen. So bietet das Dataset eine komfortable Möglichkeit über den CommandBuilder das coding zu minimierien.


Erfasst am: 10.04.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=746
© Copyright 2003 ppedv AG - http://www.ppedv.de