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

War es hilfreich?

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));
   }
}

http: // skysanders .net / Subtext / Archiv / 2010/03/02 / generic-Nullsafe-IDataRecord-Feld-getter.aspx

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";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top