Wir haben unser eigenes ORM, das wir hier verwenden, und stellen stark typisierte Wrapper für alle unsere db-Tabellen bereit. Wir erlauben auch die Ausführung von schwach typisiertem Ad-hoc-SQL, aber diese Abfragen durchlaufen immer noch dieselbe Klasse, um Werte aus einem Datenleser zu holen.C# -Datenbankzugriff: DBNull vs null
Bei der Optimierung dieser Klasse mit Oracle haben wir eine interessante Frage gestellt. Ist es besser, DBNull.Value oder null zu verwenden? Gibt es Vorteile bei der Verwendung von DBNull.Value? Es scheint "richtiger" zu sein, null zu verwenden, da wir uns von der DB-Welt getrennt haben, aber es gibt Implikationen (Sie können nicht einfach blind ToString()
, wenn ein Wert null ist), also ist es definitiv etwas, was wir machen müssen bewusste Entscheidung über.
Ich denke, es gibt noch einige Anwendungen für DBNull. Zumindest kann ich mit sqlite testen, ob ein von ExecuteScalar() zurückgegebener Wert explizit in der Datenbank gespeichert ist oder nicht. Betrachte Tabelle foo (a int, b int); mit einer einzigen Zeile (1, null). Wenn wir ExecuteScalar für einen Befehl "SELECT b FROM foo WHERE A = 1" verwenden, würde DBNull.Value zurückgegeben (die Zeile existiert, es wird eine Null gespeichert). Wenn ich ExecuteScalar auf "SELECT b FROM foo WHERE A = 2" aufrufen würde, würde es null zurückgeben (keine solche Zeile existiert). Vermutlich könnten Sie mit einem DataReader das gleiche Ergebnis erzielen, aber ich schätze den Komfort. – fostandy
Interessant. Bei der Verwendung eines ORM für den DB-Zugriff verwende ich ExecuteScalar in meinem Code nicht oft explizit. Gewöhnlich lande ich am Ende vollständige Entitätsobjekte und schaue ihre Werte auf diese Weise an. Wenn also die Entity selbst null ist, ist das eine Sache, und wenn der Wert null ist, ist das etwas anderes. Nur verschiedene Möglichkeiten, es zu tun.Ich gebe zu, dass ExecuteScalar effizienter ist, wenn Sie nur einen einzigen Wert benötigen. – jeremcc