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 mit einem SQL-Datenleser aus der Datenbank abrufe, wird kein zurückgegebener Wert if(rdr["Id"] != null)
zurückgegeben true
und schließlich eine Ausnahme für das Umwandeln einer Null als Ganzzahl ausgelöst .
Aber dies, wenn ich if (rdr["Id"] != System.DBNull.Value)
Retouren verwende false
.
Was ist der Unterschied zwischen null und System.DBNull.Value?
System.Data
, und die andere ist ein spezieller Wert, der das Fehlen eines Referenten anzeigt. Sie haben nichts miteinander zu tun. Können Sie näher erläutern, worüber Sie verwirrt sind? Ist Ihre eigentliche Frage : „Warum tunDataRows
undDataReaders
setzenDBNull.Value
innerhalb von sich selbst stattnull
?“null
.Antworten:
Nun,
null
ist keine Instanz irgendeiner Art. Es ist vielmehr eine ungültige Referenz.Ist
System.DbNull.Value
jedoch ein gültiger Verweis auf eine Instanz vonSystem.DbNull
(System.DbNull
ist ein Singleton undSystem.DbNull.Value
gibt Ihnen einen Verweis auf die einzelne Instanz dieser Klasse), die nicht vorhandene * Werte in der Datenbank darstellt.* Wir würden normalerweise sagen
null
, aber ich möchte das Problem nicht verwechseln.Es gibt also einen großen konzeptionellen Unterschied zwischen den beiden. Das Schlüsselwort
null
repräsentiert eine ungültige Referenz. Die KlasseSystem.DbNull
repräsentiert einen nicht vorhandenen Wert in einem Datenbankfeld. Im Allgemeinen sollten wir vermeiden, dasselbe (in diesem Fallnull
) zu verwenden, 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, aus diesem Grund befürworten viele Leute die Verwendung des Nullobjektmusters im Allgemeinen, was genau
System.DbNull
ein Beispiel dafür ist.quelle
IDbCommand.ExecuteScalar()
, kann es entweder null zurückgeben (keine Datensätze zurückgegeben) oderDbNull
(die erste Spalte im ersten Datensatz ist ein 'nicht vorhandener Wert'). OhneDbNull
Sie könnten Sie nicht voneinander unterscheiden.Aus der Dokumentation der DBNull-Klasse :
quelle
DBNull.Value ist ärgerlich, damit umgehen zu müssen.
Ich verwende statische Methoden, die prüfen, ob es DBNull ist, und dann den Wert zurückgeben.
Wenn Sie Werte in eine DataRow einfügen, können Sie "null" nicht verwenden. Sie müssen DBNull.Value verwenden.
Zwei Darstellungen von "null" zu haben, ist ein schlechtes Design ohne offensichtlichen Nutzen.
quelle
DBNull.Value wird von den .NET-Datenbankanbietern zurückgegeben, um einen Nulleintrag in der Datenbank darzustellen. DBNull.Value ist nicht null und der Vergleich mit null für Spaltenwerte, die aus einer Datenbankzeile abgerufen werden, funktioniert nicht. Sie sollten immer mit DBNull.Value vergleichen.
http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
quelle
DataRow verfügt über eine Methode, mit
IsNull()
der Sie die Spalte testen können, wenn sie einen Nullwert hat - in Bezug auf die Null, wie sie von der Datenbank gesehen wird.DataRow["col"]==null
wird immer seinfalse
.verwenden
stattdessen.
quelle
Null ähnelt dem Nullzeiger in C ++ . Es ist also eine Referenz, die auf keinen Wert verweist .
DBNull.Value
ist völlig anders und ist eine Konstante, die zurückgegeben wird, wenn ein Feldwert NULL enthält.quelle