La mejor manera de verificar si una tabla de datos tiene un valor nulo

87

¿Cuál es la mejor manera de verificar si una tabla de datos tiene un valor nulo?

La mayoría de las veces en nuestro escenario, una columna tendrá todos los valores nulos.

(Esta tabla de datos es devuelta por una aplicación de terceros; estamos tratando de realizar una validación antes de que nuestra aplicación procese la tabla de datos)

Ananth
fuente

Respuestas:

164

Intente comparar el valor de la columna con el DBNull.Valuevalor para filtrar y administrar los valores nulos de la forma que considere adecuada.

foreach(DataRow row in table.Rows)
{
    object value = row["ColumnName"];
    if (value == DBNull.Value)
        // do something
    else
        // do something else
}

Más información sobre la clase DBNull


Si desea verificar si existe un valor nulo en la tabla, puede usar este método:

public static bool HasNull(this DataTable table)
{
    foreach (DataColumn column in table.Columns)
    {
        if (table.Rows.OfType<DataRow>().Any(r => r.IsNull(column)))
            return true;
    }

    return false;
}

que te permitirá escribir esto:

table.HasNull();
cazador
fuente
1
¿Cuál es la mejor práctica para saber dónde debería ir este método de extensión?
StuperUser
6
Normalmente creo una carpeta "Extensiones" en alguna biblioteca común o en mi DAL. Cree un archivo llamado "DataTableExtensions.cs" y agregue ese método. A continuación, simplemente agregaría "using Name.Space.Extensions" a sus archivos cs y tendrá acceso a todos los métodos de extensión definidos.
cazador
3
Puede (ahora) usar en table.AsEnumerable()lugar detable.Rows.OfType<DataRow>()
Teejay
23
foreach(DataRow row in dataTable.Rows)
{
    if(row.IsNull("myColumn"))
        throw new Exception("Empty value!")
}
zavaz
fuente
11

Puede lanzar en bucle las filas y columnas, verificar si hay nulos, realizar un seguimiento de si hay un nulo con un bool, luego verificarlo después de recorrer la tabla y manejarlo.

//your DataTable, replace with table get code
DataTable table = new DataTable();
bool tableHasNull = false;

foreach (DataRow row in table.Rows)
{
    foreach (DataColumn col in table.Columns)
    {
        //test for null here
        if (row[col] == DBNull.Value)
        {
            tableHasNull = true;
        }
    }
}

if (tableHasNull)
{
    //handle null in table
}

También puede salir del bucle foreach con una declaración de interrupción, por ejemplo

//test for null here
if (row[col] == DBNull.Value)
{
    tableHasNull = true;
    break;
}

Para evitar recorrer el resto de la tabla.

StuperUser
fuente
1

Haré como ...

(!DBNull.Value.Equals(dataSet.Tables[6].Rows[0]["_id"]))
Shailendra Mishra
fuente
0

Puede anular / dejar en blanco / espaciar el valor Etc utilizando LinQ Use Next Query

   var BlankValueRows = (from dr1 in Dt.AsEnumerable()
                                  where dr1["Columnname"].ToString() == ""
                                  || dr1["Columnname"].ToString() == ""
                                   || dr1["Columnname"].ToString() == ""
                                  select Columnname);

Aquí reemplace el nombre de la columna con el nombre de la columna de la tabla y "" su elemento de búsqueda en el código anterior buscamos un valor nulo.

Sandy Sing
fuente
0
DataTable dt = new DataTable();
foreach (DataRow dr in dt.Rows)
{
    if (dr["Column_Name"] == DBNull.Value)
    {
        //Do something
    }
    else
    {
        //Do something
    }
}
Sush
fuente
5
Si bien este código puede responder la pregunta, es mejor explicar cómo resolver el problema y proporcionar el código como ejemplo o referencia. Las respuestas de solo código pueden ser confusas y carecer de contexto.
Robert Columbia