Ich verwende einen SQL-Katareader, um POCOs aus einer Datenbank zu erstellen. Der Code funktioniert nur, wenn er auf einen Nullwert in der Datenbank stößt. Wenn beispielsweise die Spalte Vorname in der Datenbank einen Nullwert enthält, wird eine Ausnahme ausgelöst.
employee.FirstName = sqlreader.GetString(indexFirstName);
Was ist in dieser Situation der beste Weg, um mit Nullwerten umzugehen?
c#
sqldatareader
DenaliHardtail
quelle
quelle
int colIndex = reader.GetOrdinal(fieldname);
Folgendes tun: und dieSafeGetString
Funktion von @ marc_s leicht überladen .Sie sollten den
as
Operator in Kombination mit dem??
Operator für Standardwerte verwenden. Werttypen müssen als nullwertfähig gelesen und mit einem Standardwert versehen werden.Der
as
Bediener übernimmt das Casting einschließlich der Prüfung auf DBNull.quelle
sqlreader[indexAge] as string ?? ""
, erhalten Sie immer""
. Überlegen Sie, ob Sie(int?)sqlreader[indexAge] ?? defaultValue
stattdessen wirklich möchten. Wenn sich Ihr SQL ändert, erhalten Sie Ausnahmen anstelle von schlechten Werten. @ Stevo3000: Standard (int) ist 0, nicht -1. @ Chris: Stellen Sie sicher, dass Sie die verwenden, die Sie wirklich wollen.Für eine Zeichenfolge können Sie einfach die Objektversion (auf die über den Array-Operator zugegriffen wird) umwandeln und eine Nullzeichenfolge für Nullen erhalten:
oder
Wenn Sie für Ganzzahlen in ein nullbares int umwandeln, können Sie GetValueOrDefault () verwenden.
oder der Null-Koaleszenz-Operator (
??
).quelle
null
sondern ein DBNull-Objekt. Der Unterschied zwischen den beiden Anweisungen besteht darin, dass die erste fehlschlägt, wenn es sich nicht um eine Zeichenfolge handelt, während die zweite nur null zurückgibt, wenn es sich nicht um eine Zeichenfolge handelt.IsDbNull(int)
ist normalerweise viel langsamer als Methoden wieGetSqlDateTime
und dann zu vergleichenDBNull.Value
. Probieren Sie diese Erweiterungsmethoden für ausSqlDataReader
.Verwenden Sie sie wie folgt:
quelle
Eine Möglichkeit besteht darin, nach DB-Nullen zu suchen:
quelle
reader.IsDbNull(ColumnIndex)
funktioniert so viele Antworten sagt.Und ich möchte erwähnen, dass es möglicherweise bequemer ist, Typen zu vergleichen, wenn Sie mit Spaltennamen arbeiten.
quelle
Ich glaube nicht, dass es einen NULL- Spaltenwert gibt, wenn Zeilen innerhalb eines Datenlesers unter Verwendung des Spaltennamens zurückgegeben werden.
Wenn Sie dies tun, erhalten
datareader["columnName"].ToString();
Sie immer einen Wert, der eine leere Zeichenfolge sein kann (String.Empty
wenn Sie vergleichen müssen).Ich würde Folgendes verwenden und mir nicht zu viele Sorgen machen:
quelle
Diese Lösung ist weniger herstellerabhängig und funktioniert mit einem SQL-, OleDB- und MySQL-Reader:
quelle
Ich neige dazu, die Nullwerte in der SELECT-Anweisung durch etwas Passendes zu ersetzen.
Hier ersetze ich jede Null durch eine leere Zeichenfolge. Ihr Code wird in diesem Fall keinen Fehler auslösen.
quelle
Sie können eine generische Funktion schreiben, um Null zu überprüfen und den Standardwert einzuschließen, wenn er NULL ist. Rufen Sie dies auf, wenn Sie Datareader lesen
Verwenden Sie beim Lesen des Datenlesers
quelle
Überprüfen
sqlreader.IsDBNull(indexFirstName)
Sie dies, bevor Sie versuchen, es zu lesen.quelle
Wie erstelle ich Hilfsmethoden?
Für String
Verwendung
Für Int
Verwendung
Für Datum
Verwendung
Hinweis: Für DateTime deklarieren Sie varialbe als
quelle
Als Ergänzung zur Antwort von marc_s können Sie eine allgemeinere Erweiterungsmethode verwenden, um Werte aus dem SqlDataReader abzurufen:
quelle
Durch Einflussnahme auf die Antwort von getpsyched habe ich eine generische Methode erstellt, die den Spaltenwert anhand seines Namens überprüft
Verwendungszweck:
quelle
Ich denke, Sie möchten verwenden:
quelle
Wir verwenden eine Reihe statischer Methoden, um alle Werte aus unseren Datenlesern herauszuholen. In diesem Fall würden wir also aufrufen.
DBUtils.GetString(sqlreader(indexFirstName))
Der Vorteil der Erstellung statischer / gemeinsam genutzter Methoden besteht darin, dass Sie nicht immer und immer wieder dieselben Überprüfungen durchführen müssen ...Die statischen Methoden enthalten Code zum Überprüfen auf Nullen (siehe andere Antworten auf dieser Seite).
quelle
Sie können den bedingten Operator verwenden:
quelle
Hier gibt es viele Antworten mit nützlichen Informationen (und einigen falschen Informationen). Ich möchte alles zusammenbringen.
Die kurze Antwort auf die Frage ist, nach DBNull zu suchen - fast alle sind sich in diesem Punkt einig :)
Anstatt eine Hilfsmethode zum Lesen von nullbaren Werten pro SQL-Datentyp zu verwenden, können wir dies mit einer generischen Methode mit viel weniger Code beheben. Sie können jedoch keine einzige generische Methode sowohl für nullbare Werttypen als auch für Referenztypen verwenden. Dies wird ausführlich im nullbaren Typ als generischer Parameter erläutert. und generische C # -Einschränkung für alles, was nullbar ist .
Nach den Antworten von @ZXX und @getpsyched erhalten wir zwei Methoden zum Abrufen von nullbaren Werten, und ich habe eine dritte für Nicht-Null-Werte hinzugefügt (sie vervollständigt den Satz basierend auf der Methodenbenennung).
Normalerweise verwende ich Spaltennamen. Ändern Sie diese, wenn Sie Spaltenindizes verwenden. Anhand dieser Methodennamen kann ich feststellen, ob ich erwarte, dass die Daten nullwertfähig sind oder nicht. Dies ist sehr nützlich, wenn ich mir den vor langer Zeit geschriebenen Code anschaue.
Tipps;
Schließlich habe ich beim Testen der oben genannten Methoden für alle SQL Server-Datentypen festgestellt, dass Sie kein Zeichen [] direkt von einem SqlDataReader abrufen können. Wenn Sie ein Zeichen [] möchten, müssen Sie eine Zeichenfolge abrufen und ToCharArray () verwenden.
quelle
Ich verwende den unten aufgeführten Code, um Nullzellen in einer Excel-Tabelle zu verarbeiten, die in eine Datentabelle eingelesen wird.
quelle
quelle
und / oder ternären Operator mit Zuordnung verwenden:
Ersetzen Sie den Standardwert (wenn null) entsprechend jedem Eigenschaftstyp ...
quelle
Diese Methode ist abhängig von indexFirstName, der die nullbasierte Spaltenordnungszahl sein sollte.
Wenn Sie den Spaltenindex nicht kennen, aber keinen Namen überprüfen möchten, können Sie stattdessen diese Erweiterungsmethode verwenden:
Und verwenden Sie die Methode wie folgt:
quelle
Alte Frage, aber vielleicht braucht noch jemand eine Antwort
In Wirklichkeit habe ich dieses Problem so umgangen
Für int:
Das gleiche gilt für die Zeichenfolge. Geben Sie einfach "" anstelle von 0 zurück, da "" eine leere Zeichenfolge ist
so kannst du es gerne benutzen
und
Sehr flexibel, so dass Sie jede Abfrage einfügen können, um eine Spalte zu lesen, und sie wird niemals mit einem Fehler zurückgegeben
quelle
Hier ist eine Hilfsklasse, die andere basierend auf der Antwort von @marc_s verwenden können, wenn sie sie benötigen:
quelle
Konvertieren Sie Griffe DbNull sinnvoll.
quelle
Sie können dies auch jederzeit überprüfen
quelle
SqlDataReader