Es gibt hier viele Antworten mit nützlichen Informationen (und einigen falschen Informationen), die ich gerne zusammenfassen möchte.
Die kurze Antwort auf die Frage ist, auf DBNull zu prüfen - in diesem Punkt sind sich fast alle einig :)
Anstatt eine Hilfsmethode zu verwenden, um nullbare Werte pro SQL-Datentyp zu lesen, ermöglicht uns eine generische Methode, dieses Problem mit viel weniger Code zu lösen. Allerdings kann man nicht eine einzige generische Methode sowohl für nullbare Werttypen als auch für Referenztypen verwenden, dies wird ausführlich in Nullbarer Typ als allgemeiner Parameter möglich? y C# generische Typbeschränkung für alles, was nullbar ist .
Also, im Anschluss an die Antworten von @ZXX und @getpsyched wir am Ende mit diesem, 2 Methoden für immer nullable Werte und ich habe eine 3. für nicht-null-Werte hinzugefügt (es vervollständigt die Menge basierend auf Methode Benennung).
public static T? GetNullableValueType<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? (T?)null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNullableReferenceType<T>(this SqlDataReader sqlDataReader, string columnName) where T : class
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNonNullValue<T>(this SqlDataReader sqlDataReader, string columnName)
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
Ich verwende normalerweise Spaltennamen, ändern Sie diese, wenn Sie Spaltenindizes verwenden. Anhand dieser Methodennamen kann ich erkennen, ob ich erwarte, dass die Daten löschbar sind oder nicht. Das ist sehr nützlich, wenn man sich Code ansieht, der vor langer Zeit geschrieben wurde.
Tipps;
- Durch das Fehlen von löschbaren Spalten in der Datenbank wird dieses Problem vermieden. Wenn Sie Kontrolle über die Datenbank haben, sollten Spalten nicht null sein, indem Standard und nur bei Bedarf löschbar sein.
- Datenbankwerte nicht verzerren mit dem C#-Operator 'as', denn wenn der Cast falsch ist, wird er stillschweigend null zurückgeben.
- Mit einer Standardwertausdruck wird sich ändern Datenbank-Nullwerte in Nicht-Nullwerte für Werttypen wie int, datetime, Bit usw.
Schließlich, beim Testen der oben genannten Methoden über alle SQL Server-Datentypen entdeckte ich, dass Sie nicht direkt ein char[] von einem SqlDataReader erhalten können, wenn Sie ein char[] möchten, müssen Sie eine Zeichenfolge erhalten und ToCharArray() verwenden.