Question

(LocalVariable) ABC.string (nom) = (IDataReader) datareader.GetString (0);

cette valeur de nom provient de la base de données .. ce qui se passe ici est de savoir si cette valeur name est null en lisant il est lancer une exception?

Je fais manuellement certains si la condition ici. Je ne veux pas écrire une condition manuelle pour vérifier toutes mes variables ..

Je suis en train de faire quelque chose comme ça maintenant ..

string abc =  (Idatareader)datareader.GetValue(0);
if(abc = null)
    //assiging null
else
    assiging abc value

est-il quelque chose comme peut-on écrire méthode d'extension pour cela? merci

Était-ce utile?

La solution

Voici une des méthodes d'extension de couple qui va bien envelopper toutes vos préoccupations autour de la récupération des valeurs fortement typés à partir d'un lecteur de données. Si la valeur est DBNull la valeur par défaut du type sera retourné. Dans le cas de string qui est une classe, un null sera retourné. Si le champ était int, alors 0 serait renvoyé. De plus, si vous attendez un int?, dire d'un champ nullable int, null serait renvoyé.

Utilisation spécifique pour le cas de Kumar:

string abc = datareader.GetValueOrDefault<string>(0);

Usage général

var name = GetValueOrDefault<string>(reader, "Name");

ou

var name = reader.GetValueOrDefault<string>("Name");

ou

var name = reader.GetValueOrDefault<string>(0);

Extension

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 / sous-texte / archives / 2010/03/02 / générique nullsafe-IDataRecord-champ getter.aspx

Autres conseils

Tout comme @ ciel ponceuses réponse mais moins stricte avec des 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));
}

Ma solution est que:

private static T GetValue<T>(object o) {
    if (typeof(DBNull) != o.GetType()) {
        return (T) o;
    }
    return default(T);
}

Quand, Status = GetValue<string>(currentDataRow["status"])

La combinaison de solutions haut et suggestions, voici un C # 6 expression flèche version avec support pour GetValue<T> et GetValueOrDefault<T> avec des paramètres de valeur par défaut en option.

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

J'utiliser quelque chose comme ceci:

string abc = (IDataReader)datareader.GetValue(0) ?? "Default";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top