Najlepszy sposób na sprawdzenie, czy tabela danych zawiera wartość null

87

jaki jest najlepszy sposób sprawdzenia, czy tabela danych zawiera wartość null?

W naszym scenariuszu przez większość czasu jedna kolumna będzie miała wszystkie wartości null.

(Ten plik danych jest zwracany przez aplikację innej firmy - próbujemy przeprowadzić walidację, zanim nasza aplikacja przetworzy tabelę danych)

Ananth
źródło

Odpowiedzi:

164

Spróbuj porównać wartość kolumny z DBNull.Valuewartością, aby przefiltrować i zarządzać wartościami null w dowolny sposób.

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

Więcej informacji o klasie DBNull


Jeśli chcesz sprawdzić, czy w tabeli istnieje wartość null, możesz użyć tej metody:

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

który pozwoli ci napisać to:

table.HasNull();
Łowca
źródło
1
Jaka jest najlepsza praktyka w przypadku, gdy ta metoda rozszerzenia powinna się udać?
StuperUser,
6
Zwykle tworzę folder „Rozszerzenia” w jakiejś wspólnej bibliotece lub w moim DAL. Utwórz plik o nazwie „DataTableExtensions.cs” i dodaj tę metodę. Następnie wystarczy dodać „using Name.Space.Extensions” do swoich plików cs i mieć dostęp do wszystkich zdefiniowanych metod rozszerzeń.
myśliwy
3
Możesz (teraz) użyć table.AsEnumerable()zamiasttable.Rows.OfType<DataRow>()
Teejay
23
foreach(DataRow row in dataTable.Rows)
{
    if(row.IsNull("myColumn"))
        throw new Exception("Empty value!")
}
zavaz
źródło
11

Możesz zapętlić rzutowanie wierszy i kolumn, sprawdzanie wartości null, śledzenie, czy istnieje wartość null z wartością bool, a następnie sprawdzanie tego po przejściu przez pętlę tabeli i obsłużenie tego.

//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
}

Możesz także wyjść z pętli foreach za pomocą instrukcji break np

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

Aby zaoszczędzić na przechodzeniu przez pozostałą część tabeli.

StuperUser
źródło
1

Zrobię to ....

(!DBNull.Value.Equals(dataSet.Tables[6].Rows[0]["_id"]))
Shailendra Mishra
źródło
0

Możesz wyzerować / puste / spacja wartość Etc używając LinQ Użyj następującego zapytania

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

Wymienić tu ColumnName z nazwy kolumny tabeli i „” przedmiot szukaj w powyższym kodzie szukamy wartość zerową.

Sandy Sing
źródło
0
DataTable dt = new DataTable();
foreach (DataRow dr in dt.Rows)
{
    if (dr["Column_Name"] == DBNull.Value)
    {
        //Do something
    }
    else
    {
        //Do something
    }
}
Sush
źródło
5
Chociaż ten kod może odpowiedzieć na pytanie, lepiej jest wyjaśnić, jak rozwiązać problem i podać kod jako przykład lub odniesienie. Odpowiedzi zawierające tylko kod mogą być mylące i pozbawione kontekstu.
Robert Columbia,