Pregunta

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

este valor nombre proviene de la base de datos .. lo que sucede aquí es si este valor es nulo nombre, durante su lectura está lanzando una excepción?

Estoy haciendo manualmente alguna si la condición aquí. No quiero escribir una regulación manual para comprobar todas las variables de mis ..

Me estoy haciendo algo como esto ahora ..

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

¿hay algo así como podemos escribir método de extensión para esto? gracias

¿Fue útil?

Solución

Aquí hay un par de métodos de extensión que va muy bien concluir todas sus preocupaciones en torno a la recuperación de los valores inflexible de tipos desde un lector de datos. Si el valor es DBNull se devolverá el valor por defecto del tipo. En el caso de string que es una clase, se devolverá un null. Si el campo era int, sería devuelto a continuación 0. Además, si usted está esperando un int?, digamos de un campo int anulable, sería devuelto null.

Uso Específico para el caso de Kumar:

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

Uso general

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

o

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

o

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

Extensión

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 / subtexto / archivo / 2010/03/02 / genérico-nullsafe-IDataRecord-campo-getter.aspx

Otros consejos

Al igual que en el cielo-Sanders respuesta @ pero menos estricto con las conversiones:

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

Mi solución es que:

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

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

Al combinar soluciones superiores y sugerencias, que aquí hay una C # 6 flecha expresión versión con soporte para GetValue<T> y GetValueOrDefault<T> con parámetros de valor por defecto opcionales.

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

Me gustaría utilizar algo como esto:

string abc = (IDataReader)datareader.GetValue(0) ?? "Default";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top