c# Lector de datos SQL: manejo de valores de columna nulos





11 Answers

Deberías usar el operador as combinado con el ?? Operador para los valores por defecto. Los tipos de valor deberán leerse como anulables y se les dará un valor predeterminado.

employee.FirstName = sqlreader[indexFirstName] as string;
employee.Age = sqlreader[indexAge] as int? ?? default(int);

El operador as encarga de la fundición, incluida la comprobación de DBNull.

c# sqldatareader

Estoy usando un SQLdatareader para construir POCO desde una base de datos. El código funciona, excepto cuando encuentra un valor nulo en la base de datos. Por ejemplo, si la columna Nombre en la base de datos contiene un valor nulo, se lanza una excepción.

employee.FirstName = sqlreader.GetString(indexFirstName);

¿Cuál es la mejor manera de manejar valores nulos en esta situación?




IsDbNull(int) suele ser mucho más lento que usar métodos como GetSqlDateTime y luego compararlo con DBNull.Value . Pruebe estos métodos de extensión para SqlDataReader .

public static T Def<T>(this SqlDataReader r, int ord)
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return default(T);
    return ((INullable)t).IsNull ? default(T) : (T)t;
}

public static T? Val<T>(this SqlDataReader r, int ord) where T:struct
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? (T?)null : (T)t;
}

public static T Ref<T>(this SqlDataReader r, int ord) where T : class
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? null : (T)t;
}

Úsalos así:

var dd = r.Val<DateTime>(ords[4]);
var ii = r.Def<int>(ords[0]);
int nn = r.Def<int>(ords[0]);



No creo que haya un valor de columna NULL , cuando las filas se devuelven dentro de un datareader usando el nombre de columna.

Si lo hace datareader["columnName"].ToString(); siempre le dará un valor que puede ser una cadena vacía ( String.Empty si necesita comparar).

Usaría lo siguiente y no me preocuparía demasiado:

employee.FirstName = sqlreader["columnNameForFirstName"].ToString();



reader.IsDbNull(ColumnIndex) funciona como dicen muchas respuestas.

Y quiero mencionar que si trabaja con nombres de columna, la comparación de tipos puede ser más cómoda.

if(reader["TeacherImage"].GetType() == typeof(DBNull)) { //logic }



Compruebe sqlreader.IsDBNull(indexFirstName) antes de intentar leerlo.




Creo que querrías usar:

SqlReader.IsDBNull(indexFirstName)



Utilizamos una serie de métodos estáticos para extraer todos los valores de nuestros lectores de datos. Entonces, en este caso estaríamos llamando a DBUtils.GetString(sqlreader(indexFirstName)) El beneficio de crear métodos estáticos / compartidos es que no tienes que hacer las mismas comprobaciones una y otra vez ...

El método (s) estático (s) contendría código para verificar si hay nulos (vea otras respuestas en esta página).




Estoy utilizando el código que se indica a continuación para manejar celdas nulas en una hoja de Excel que se lee en una tabla de datos.

if (!reader.IsDBNull(2))
{
   row["Oracle"] = (string)reader[2];
}



y / o usar operador ternario con asignación:

employee.FirstName = rdr.IsDBNull(indexFirstName))? 
                     String.Empty: rdr.GetString(indexFirstName);

reemplace el valor predeterminado (cuando sea nulo) según corresponda para cada tipo de propiedad ...




Puede utilizar el operador condicional:

employee.FirstName = sqlreader["indexFirstName"] != DBNull.Value ? sqlreader[indexFirstName].ToString() : "";



Alguna vez puedes comprobar esto también

if(null !=x && x.HasRows)
{ ....}



Related