Null sichere Art und Weise Werte von einem IDataReader zu erhalten
-
25-09-2019 - |
Frage
(ortsveränderlichen) ABC.string (Name) = (IDataReader) datareader.GetString (0);
Dieser Name Wert wird aus der Datenbank kommen .. was hier geschieht, ist, wenn dieser Name Wert es wirft eine Ausnahme null beim Lesen ist?
Ich mache einige manuell, wenn die Bedingung hier. Ich will nicht einen manuellen Zustand schreiben alle meine Variablen zu überprüfen ..
Ich bin jetzt so etwas wie dies zu tun ..
string abc = (Idatareader)datareader.GetValue(0);
if(abc = null)
//assiging null
else
assiging abc value
ist es so etwas wie können wir Erweiterungsmethode für dieses schreiben? Dank
Lösung
Hier ist ein Paar Erweiterungsmethoden, die gut alle Ihre Anliegen werden einpacken um von einem Datenleser stark typisierte Werte abgerufen werden. Wenn der Wert DBNull ist die Standardeinstellung des Typs zurückgegeben. Im Falle von string
die eine Klasse ist, wird ein null
zurückgegeben werden. Wenn das Feld int
ist, würde dann 0
zurückgegeben werden. Wenn Sie darüber hinaus eine int?
erwarten, sagen wir von einem Nullable-int Feld, würde null
zurückgegeben werden.
Besondere Verwendung für Kumars Fall:
string abc = datareader.GetValueOrDefault<string>(0);
Allgemeine Verwendung
var name = GetValueOrDefault<string>(reader, "Name");
oder
var name = reader.GetValueOrDefault<string>("Name");
oder
var name = reader.GetValueOrDefault<string>(0);
Erweiterung
public static class NullSafeGetter
{
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.GetValueOrDefault<T>(ordinal);
}
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
{
return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
}
}
Andere Tipps
ähnlich @ sky-Schleifern Antwort, aber weniger streng mit Conversions:
public static T Get<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.Get<T>(ordinal);
}
public static T Get<T>(this IDataRecord row, int ordinal)
{
var value = row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal);
return (T)Convert.ChangeType(value, typeof(T));
}
Meine Lösung ist, dass:
private static T GetValue<T>(object o) {
if (typeof(DBNull) != o.GetType()) {
return (T) o;
}
return default(T);
}
Wenn Status = GetValue<string>(currentDataRow["status"])
Die Kombination von Top-Lösungen und Anregungen, hier ist ein C # 6 Pfeil Ausdruck Version mit Unterstützung für GetValue<T>
und GetValueOrDefault<T>
mit optionalem Standardwert Parametern.
public static class DataRecordExtensions {
/// <summary>
/// Generically extracts a field value by name from any IDataRecord as specified type. Will throw if DNE.
/// </summary>
public static T GetValue<T>(this IDataRecord row, string fieldName)
=> row.GetValue<T>(row.GetOrdinal(fieldName));
/// <summary>
/// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will throw if DNE.
/// </summary>
public static T GetValue<T>(this IDataRecord row, int ordinal)
=> (T)row.GetValue(ordinal);
/// <summary>
/// Generically extracts a field value by name from any IDataRecord as specified type. Will return default generic types value if DNE.
/// </summary>
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName, T defaultValue = default(T))
=> row.GetValueOrDefault<T>(row.GetOrdinal(fieldName), defaultValue);
/// <summary>
/// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will return default generic types value if DNE.
/// </summary>
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal, T defaultValue = default(T))
=> (T)(row.IsDBNull(ordinal) ? defaultValue : row.GetValue(ordinal));
}
ich so etwas wie diese verwenden würde:
string abc = (IDataReader)datareader.GetValue(0) ?? "Default";