Was ist der Sinn von DBNull?
In .NET da ist der null
Referenz, das wird überall verwendet, um anzuzeigen, dass eine Referenz auf ein Objekt leer ist, und dann gibt es die DBNull
zu, die von Datenbank-Treiber (und einige andere) zu bezeichnen... ziemlich viel die gleiche Sache. Natürlich, das schafft eine Menge Verwirrung und Konvertierungsroutinen zu aufgewühlt, etc.
Also, warum ist das original .NET-Autoren entscheiden? Für mich macht es keinen Sinn. Ihre Dokumentation macht keinen Sinn, entweder:
Der DBNull-Klasse repräsentiert einen nicht vorhandenen Wert. In einer Datenbank beispielsweise eine Spalte in einer Zeile einer Tabelle kann keine Daten enthalten, löschen. Das heißt, die Spalte ist als nicht vorhanden, statt nur nicht mit einem Wert. Ein DBNull-Objekt repräsentiert die nicht vorhandene Spalte. Darüber hinaus werden die COM-interop, verwendet die Klasse DBNull zu unterscheiden zwischen einem VT_NULL Variante, die zeigt einen nicht vorhandenen Wert, und ein VT_EMPTY Variante, die zeigt an, das ein unbekannter Wert.
Was dieser Mist über eine "Spalte nicht vorhanden"? Eine Spalte vorhanden ist, ist es einfach nicht Wert für die jeweilige Zeile. Wenn es das nicht gibt, ich würde eine Ausnahme ausgelöst werden, versuchen auf die spezifische Zelle, nicht eine DBNull
! Ich kann verstehen, die Notwendigkeit zu unterscheiden zwischen VT_NULL
und VT_EMPTY
aber warum dann nicht eine COMEmpty
statt Klasse? Das wäre ein viel ordentlicher passen in das ganze .NET framework.
Bin ich etwas fehlt? Kann jemand Aufschluss geben, warum DBNull
erfunden wurde und welche Probleme hilft es zu lösen?
InformationsquelleAutor der Frage Vilx- | 2010-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Punkt ist, dass in bestimmten Situationen gibt es einen Unterschied zwischen einer Datenbank mit dem Wert null und einem .NETTO-Null.
Zum Beispiel. Wenn Sie mit ExecuteScalar (das gibt die erste Spalte der ersten Zeile in der Ergebnismenge) und Sie bekommen eine null zurück, das bedeutet, dass die SQL ausgeführt, nicht wieder alle Werte. Wenn Sie DBNull zurück, es bedeutet, dass ein Wert zurückgegeben wurde, die von der SQL-und es war NULL. Sie müssen in der Lage sein, den Unterschied zu erkennen.
InformationsquelleAutor der Antwort Colin Mackay
Werde ich nicht mit den trend hier. Ich geh auf record:
Das argument wird oft vorgebracht, dass
null
ist eine ungültige Referenz, und dassDBNull
ist ein null-Objekt-pattern; weder wahr ist. Zum Beispiel:dies ist nicht eine "ungültige Referenz"; es ist ein
null
Wert. In der Tatnull
bedeutet das, was immer du willst, das es bedeutet, und ehrlich gesagt, ich habe absolut kein problem, die Arbeit mit Werten, die möglicherweisenull
(ja, auch in SQL müssen wir richtig arbeiten mitnull
- ändert sich hier nichts). Ebenso ist die "null-Objekt-pattern" macht nur dann Sinn, wenn Sie tatsächlich behandeln Sie es als ein Objekt in OOP-Hinsicht, aber wenn wir einen Wert haben, kann "unseren Wert, oder einDBNull
" dann muss esobject
so können wir nicht tun, etwas sinnvolles mit ihm.Es gibt so viele schlechte Dinge mit
DBNull
:object
da nurobject
halten kannDBNull
oder anderen WertDBNull
" vs "kann einen Wert odernull
"null
perfekt in 1.1DBDataReader.IsDBNull
oderDataRow.IsNull
- weder die tatsächlich benötigenDBNull
zu existieren in Bezug auf die APIDBNull
fehl in Bezug auf die null-coalescing;value ?? defaultValue
funktioniert nicht, wenn der WertDBNull
DBNull.Value
können nicht verwendet werden, optionale Parameter, da es nicht eine KonstanteDBNull
identisch sind, um die Semantik vonnull
; insbesondereDBNull
eigentlich gleichDBNull
- so ist es nicht den job machen, der Vertretung der SQL semantischeobject
DBNull
könnte man genauso gut getestet haben für nurnull
null
Wert ist es nicht verschickt... naja, hier ist eine Idee: wenn Sie nicht möchten, dass ein parameter gesendet - nicht fügen Sie Sie der parameters-AuflistungDBNull
außer als ein zusätzliches ärgernis, wenn im Gespräch mit der ADO.NET codeNur auch nur im entferntesten überzeugende argument, das ich habe immer gesehen zu rechtfertigen, die Existenz solch ein Wert ist in
DataTable
wenn man die Werte zum erstellen einer neuen Zeile; einnull
bedeutet "verwenden Sie den Standard", einDBNull
ist explizit eine null - ehrlich diese API hatte, konnte eine spezifische Behandlung für diese Fall - eine imaginäreDataRow.DefaultValue
zum Beispiel wäre viel besser, als die Einführung einerDBNull.Value
infiziert weite Teile des Codes für keinen Grund.Gleichermaßen, die
ExecuteScalar
Szenario ist... zu schwach am besten, wenn Sie ausführen, eine Skalare Methode, Sie erwarten Ergebnis. In dem Szenario, wo es keine Zeilen gibt, die Rückgabenull
scheint nicht zu schrecklich. Wenn Sie unbedingt brauchen, um keine Verwechslungen zwischen "keine " Zeilen" und "eine einzige null zurückgegeben", gibt ' s die reader-API.Diesem Schiff gesegelt ist lange her, und es ist viel viel zu spät, um es zu beheben. Aber! Bitte nicht glaube, dass jeder zustimmt, dass dies eine "offensichtliche" Sache. Viele Entwickler tun nicht siehe Wert in diese seltsame Falten auf die BCL.
Ich tatsächlich Fragen, ob all dies ergibt sich aus zwei Dingen:
Nothing
statt etwas mit "null" in VBif(value is DBNull)
syntax "sieht genauso aus wie SQL", anstatt die ach-so-schwierigif(value==null)
Zusammenfassung:
Haben 3 Optionen (
null
,DBNull
oder ein Aktueller Wert) ist nur dann sinnvoll, wenn es ein echtes Beispiel, wo Sie brauchen, um keine Verwechslungen zwischen 3 verschiedenen Fällen. Ich habe noch um zu sehen, eine Gelegenheit, wo muss ich repräsentieren zwei verschiedene "null" - Staaten, alsoDBNull
ist völlig redundant, danull
existiert bereits und hat viel bessere Sprache und die runtime-support.InformationsquelleAutor der Antwort Marc Gravell
DbNull
stellt eine box ohne Inhalt;null
zeigt die nicht-Existenz der box.InformationsquelleAutor der Antwort Rikalous
Verwenden Sie DBNull für fehlende Daten. Null in der .NET-Sprache bedeutet, dass es keine Zeiger für ein Objekt/variable.
DBNull fehlende Daten: http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
Den Auswirkungen von fehlenden Daten auf die Statistik:
http://en.wikipedia.org/wiki/Missing_values
InformationsquelleAutor der Antwort jvdbogae
Gibt es einige Unterschiede zwischen einem CLR null und DBNull. Zuerst null in relationalen Datenbanken hat verschiedene "gleich" - Semantik: null ist nicht gleich null. CLR null IST gleich null.
Aber ich vermute, der Hauptgrund ist, das zu tun, mit der Art-parameter default-Werte in SQL server und der Umsetzung der Anbieter.
Den Unterschied zu sehen, erstellen Sie eine Prozedur mit einem parameter, der einen Standardwert hat:
Gut strukturierte DAL code zu trennen, Befehl Schöpfung aus einer Verwendung zu aktivieren, verwenden Sie den gleichen Befehl viele Male, zum Beispiel zum aufrufen einer gespeicherten Prozedur viele Male effizient). Schreiben Sie eine Methode, die zurückgibt, ein SqlCommand-Objekt repräsentiert die oben beschriebene Prozedur:
Wenn Sie nun den Befehl aufzurufen, ohne die @s-parameter, oder setzen Sie seinen Wert auf (CLR) null wird, wird der default-Wert 'hello'. Wenn Sie auf der anderen Seite stellen Sie den parameter Wert DBNull.Wert, es verwendet wird, und "echo" DbNull.Wert.
Da gibt es zwei verschiedene Ergebnisse mit CLR null oder die Datenbank null als Parameterwert kann, kann Sie nicht repräsentieren beiden Fällen mit nur einer von Ihnen. Wenn CLR null war die einzige zu sein, es müsste so funktionieren, wie DBNull.Wert heute. Ein Weg, um anzuzeigen, dass der Anbieter "ich möchte, dass die Verwendung der default-Wert" könnte dann nicht erklären, die parameter (ein parameter mit einem default-Wert natürlich macht Sinn um zu beschreiben, wie ein "optionaler parameter"), aber in einem Szenario, in dem das command-Objekt wird zwischengespeichert und wiederverwendet werden, dies führt zu entfernen und neu-hinzufügen des Parameters.
Ich bin mir nicht sicher, ob ich denke, dass DBNull eine gute Idee war oder nicht, aber eine Menge Leute sind sich nicht bewusst, die Dinge, die ich erwähnt habe hier, so habe ich es erwähnenswert.
InformationsquelleAutor der Antwort The Dag