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).
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);
}
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;
- Wenn die Datenbank keine nullbaren Spalten enthält, wird dieses Problem vermieden. Wenn Sie die Kontrolle über die Datenbank haben, sollten Spalten standardmäßig nicht null und nur bei Bedarf nullwertfähig sein.
- Verwandeln Sie keine Datenbankwerte mit dem Operator C # 'as', da bei einer falschen Umwandlung stillschweigend null zurückgegeben wird.
- Durch die Verwendung eines Standardwertausdrucks werden Datenbank-Nullwerte für Werttypen wie int, datetime, bit usw. in Nicht-Null-Werte geändert.
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.
int colIndex = reader.GetOrdinal(fieldname);
Folgendes tun: und dieSafeGetString
Funktion von @ marc_s leicht überladen .