Ответ 1
Вы можете сделать это:
var LYSMKWh =
resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value)
? 0
: Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
В моей программе я перебираю данные, чтобы получать данные из каждого поля. Одна строка моего кода выглядит так:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
В принципе, я просто беру значение, которое в ячейке, и преобразовываю его в int32. Я сталкиваюсь с проблемой, хотя, когда данные в поле являются нулевыми. Я получаю сообщение об ошибке Invalid Cast о невозможности конвертировать "DBNull" в другой тип.
Итак, я знаю, что я могу просто проверить значение поля, прежде чем пытаюсь преобразовать его, выполнив что-то вроде этого:
if (resultsDT.Rows[currentRow]["LYSMKWh"] == null)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
Но есть ли лучший способ сделать это? Есть ли что-то, что я могу сделать "inline", пока я пытаюсь преобразовать значение, не прибегая к использованию if
?
EDIT: я попытался использовать этот предложенный метод:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0");
К сожалению, я все еще получил сообщение об ошибке Invalid Cast в отношении типа DBNull. Было высказано предположение, что у меня могут быть проблемы с использованием если типы с обеих сторон были разными.
Кроме того, поскольку у меня есть полный контроль над данными, с которыми я строю свой datatable, я изменил его так, чтобы никакие нулевые значения не были записаны ни в какое поле. Таким образом, это в значительной степени отрицает необходимость преобразования null в int32, в этом случае. Спасибо за все советы, всем!
Вы можете сделать это:
var LYSMKWh =
resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value)
? 0
: Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]);
используйте Оператор:
resultsDT.Rows[currentRow][...] ?? "0"
(ожидая, что поле будет строкой - если не изменить "0" )
Вы можете использовать оператор С# ??
, который проверяет значение для null и если оно null, присваивает ему значение по умолчанию.
Вы можете использовать собственный метод конвертации:
public static int ConvertToInt32(object value, int defaultValue) {
if (value == null)
return defaultValue;
return Convert.ToInt32(value);
}
Вам могут потребоваться перегрузки, которые берут другие типы, такие как строка. У вас могут быть проблемы с оператором ??
, если типы с обеих сторон разные.
Вы можете заменить его тройным оператором:
var rowData = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0;
В качестве альтернативы оператор ??
мог бы работать:
int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0);
Но я думаю, что это менее читаемо.
Проверьте, если он DBNull.Value
вместо null
:
if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value)
{
resultsDT.Rows[currentRow]["LYSMKWh"] = 0;
}
Тройное выражение будет работать следующим образом:
var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"];
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0;
Вы можете использовать Оператор:
object x = null;
int i = (int)(x ?? 0)
Вы можете использовать метод расширения.
int LYSMKWh = resultsDT.Rows[currentRow]["LYSMKWh"].IfNullThenZero();
Создайте класс ниже
public static class Converter
{
public static Int32 IfNullThenZero(this object value)
{
if (value == DBNull.Value)
{
return 0;
}
else
{
return Convert.ToInt32(value);
}
}
}