Подтвердить что ты не робот

Лучший способ обработки Datarow DBNull

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

Я хочу знать, каким должен быть способ проверки DBNull для значений DataTable - DataRow.

Пример

У меня есть DataRow, который извлекает информацию из базы данных из типа строк, например:

varchar, money, Int и т.д.

Каким должен быть мой (простой и приятный) подход для решения такой ситуации.

4b9b3361

Ответ 1

Try:

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

    }
    else
    {
    }
}

Ответ 2

Попробуйте это

Для varchar

string val = dr["name"].ToString();

Для int

int? val = dr["status"] == DBNull.Value ? (int?) null : Convert.ToInt32(dr["status"]);

Сделайте то же самое для Money, Decimal, как это сделано для int, заменив соответствующими типами .Net

Ответ 3

Вы можете использовать метод расширения, например:

public static T GetValue<T>(this OracleDataReader reader, string fieldName)
{
    T result = default(T);
    int index = reader.GetOrdinal(fieldName);

    if (reader.IsDBNull(index))
    {
        return default(T);
    }

    if (typeof(T) == typeof(string))
    {
        result = (T)Convert.ChangeType(reader.GetString(index), typeof(T));
    }

    if (typeof(T) == typeof(int))
    {
        result = (T)Convert.ChangeType(reader.GetInt32(index), typeof(T));
    }

    if (typeof(T) == typeof(DateTime))
    {
        result = (T)Convert.ChangeType(reader.GetDateTime(index), typeof(T));
    }

    if (typeof(T) == typeof(byte[]))
    {
        OracleLob blob = reader.GetOracleLob(index);
        result = (T)Convert.ChangeType(blob.Value, typeof(T));
    }

    return result;
}

И вы можете использовать как string title = reader.GetValue<string>("title")

Ответ 4

четко определенные сопоставления для CLR и SQL-типов, поэтому вопрос заключается в том, как эффективно и точно отображать эти типы. Долгосрочным, самым простым способом, вероятно, является использование автоматизированного процесса сопоставления, который отображает свойства вашего класса в столбцы в DataRow. Вы можете написать свой собственный или найти много примеров/продуктов в Интернете (любые ORM функции это как основные функции).

Предполагая, что вы все еще хотите выполнять ручные назначения, вам нужно определить, как вы хотите обрабатывать нулевые значения из базы данных. Вы хотите присвоить их соответствующему типу NULL? вы хотите использовать default(T)? вы хотите использовать другое значение (по умолчанию может быть плохой заменой null)? Например, температура 0 градусов вполне допустима, но default(float) == 0. Если вы используете default(T), вы не сможете определить разницу между нулем и значением, которое было нулевым в базе данных.

После того, как вы определили стратегию назначения, добавьте код в форму многократного использования (методы расширения, вспомогательный класс и т.д.) Предпочитайте, если возможно, разблокировать точный тип, поскольку это будет самым быстрым. После этого распакуйте, затем введите. После этого используйте класс Convert.