Лучший способ проверить, есть ли в таблице данных нулевое значение


87

как лучше всего проверить, есть ли в таблице данных нулевое значение?

В большинстве случаев в нашем сценарии один столбец будет иметь все нулевые значения.

(Эта таблица данных возвращается сторонним приложением - мы пытаемся провести проверку до того, как наше приложение обработает таблицу данных)


Ответы:


164

Попробуйте сравнить значение столбца со DBNull.Valueзначением для фильтрации и управления нулевыми значениями любым удобным для вас способом.

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

Подробнее о классе DBNull


Если вы хотите проверить, существует ли в таблице нулевое значение, вы можете использовать этот метод:

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

что позволит вам написать это:

table.HasNull();

1
Что лучше всего подойдет для этого метода расширения?
StuperUser 05

6
Я обычно создаю папку «Расширения» в какой-нибудь общей библиотеке или в моем DAL. Создайте файл с именем «DataTableExtensions.cs» и добавьте этот метод. Затем вы просто добавляете «using Name.Space.Extensions» в свои файлы cs и получаете доступ ко всем определенным методам расширения.
hunter

3
Вы можете (сейчас) использовать table.AsEnumerable()вместоtable.Rows.OfType<DataRow>()
Teejay

23
foreach(DataRow row in dataTable.Rows)
{
    if(row.IsNull("myColumn"))
        throw new Exception("Empty value!")
}

11

Вы можете в цикле генерировать строки и столбцы, проверяя наличие нулей, отслеживая, есть ли нуль с помощью bool, а затем проверять его после цикла по таблице и обрабатывать его.

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

Вы также можете выйти из цикла foreach с помощью оператора break, например

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

Чтобы избежать перебора остальной части таблицы.



0

Вы можете указать значение null / blank / space Etc, используя LinQ Использовать следующий запрос

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

Здесь замените Columnname именем столбца таблицы и "" вашего элемента поиска в приведенном выше коде мы ищем нулевое значение.


0
DataTable dt = new DataTable();
foreach (DataRow dr in dt.Rows)
{
    if (dr["Column_Name"] == DBNull.Value)
    {
        //Do something
    }
    else
    {
        //Do something
    }
}

5
Хотя этот код может дать ответ на вопрос, лучше объяснить, как решить проблему, и предоставить код в качестве примера или ссылки. Ответы только с кодом могут сбивать с толку и не иметь контекста.
Роберт Колумбия
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.