Frage Was ist der Unterschied zwischen null und System.DBNull.Value?


Gibt es einen Unterschied zwischen Null und System.DBNull.Value? Wenn ja, was ist das?

Ich habe dieses Verhalten jetzt bemerkt -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

Während ich Daten aus der Datenbank mithilfe eines SQL-Datenreaders abrufe, wird kein Wert zurückgegeben if(rdr["Id"] != null) ist zurückgekommen true und warf schließlich eine Ausnahme für das Ausgeben einer Null als Ganzzahl.

Aber, wenn ich es benutze if (rdr["Id"] != System.DBNull.Value) kehrt zurück false.

Was ist der Unterschied zwischen null und System.DBNull.Value?


76
2018-02-10 14:33


Ursprung


Antworten:


Gut, null ist keine Instanz eines beliebigen Typs. Es ist vielmehr eine ungültige Referenz.

Jedoch, System.DbNull.Value, ist eine gültige Referenz auf eine Instanz von System.DbNull (System.DbNull ist ein Singleton und System.DbNull.Value gibt Ihnen einen Verweis auf die einzelne Instanz dieser Klasse), die nicht existent darstellt* Werte in der Datenbank.

* Wir würden normalerweise sagen null, aber ich möchte das Problem nicht durcheinander bringen.

Es gibt also einen großen konzeptionellen Unterschied zwischen den beiden. Das Schlüsselwort null repräsentiert eine ungültige Referenz. Die Klasse System.DbNull repräsentiert einen nicht vorhandenen Wert in einem Datenbankfeld. Im Allgemeinen sollten wir versuchen, das gleiche zu vermeiden (in diesem Fall) null) um zwei sehr unterschiedliche Konzepte darzustellen (in diesem Fall eine ungültige Referenz gegenüber einem nicht vorhandenen Wert in einem Datenbankfeld).

Denken Sie daran, das ist der Grund, warum viele Leute befürworten die Verwendung der Null-Objektmuster im Allgemeinen, was genau ist System.DbNull ist ein Beispiel für.


95
2018-02-10 14:36



Aus der Dokumentation des DBNull-Klasse:

Verwechseln Sie den Begriff Null in einer objektorientierten Programmiersprache nicht mit einem DBNull-Objekt. In einer objektorientierten Programmiersprache bedeutet Null das Fehlen einer Referenz auf ein Objekt. DBNull repräsentiert eine nicht initialisierte Variante oder nicht vorhandene Datenbankspalte.


20
2018-02-10 14:38



DBNull.Value ist nervig, um damit umgehen zu müssen.

Ich verwende statische Methoden, die überprüfen, ob es DBNull ist und dann den Wert zurückgeben.

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

Wenn Sie Werte in eine DataRow einfügen, können Sie auch nicht "null" verwenden, Sie müssen DBNull.Value verwenden.

Haben zwei Darstellungen von "Null" ist ein schlechtes Design für keinen offensichtlichen Nutzen.


9
2018-06-25 22:34



DBNull.Value ist, was die .NET-Datenbankprovider zurückgeben, um einen Nulleintrag in der Datenbank darzustellen. DBNull.Value ist nicht null und Vergleiche mit null für Spaltenwerte, die aus einer Datenbankzeile abgerufen werden, funktionieren nicht. Sie sollten immer mit DBNull.Value vergleichen.

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx


5
2018-02-10 14:35



DataRow hat eine Methode, die aufgerufen wird IsNull() die Sie verwenden können, um die Spalte zu testen, wenn sie einen Nullwert hat - in Bezug auf den Nullwert, wie er von der Datenbank erkannt wird.

DataRow["col"]==null wird immer sein false.

benutzen

DataRow r;
if (r.IsNull("col")) ...

stattdessen.


3
2018-02-10 14:37



Null ist ähnlich wie Nullzeiger in C ++. So ist es ein Referenz, die nicht auf irgendeinen Wert zeigt.

DBNull.Value ist ganz anders und ist ein Konstante was zurückgegeben wird, wenn ein Feldwert NULL enthält.


3
2018-02-10 14:38