Использование GetDecimal дает ошибку в выражении условия

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

Data = varCmd.IsDBNull(2) ? null : varCmd.GetDecimal(2)

Поскольку это дает сообщение об ошибке "Type of conditional expression cannot be determined because there is no implicit conversion between string and decimal ". Что можно использовать в качестве значения по умолчанию для GetDecimal()? Любая помощь?


person beginner    schedule 01.08.2017    source источник
comment
Похожие проблемы: stackoverflow.com/questions/9308443/ и stackoverflow.com/questions/19289359/. Используйте (decimal?) null, если Data имеет тип Nullable<decimal>.   -  person Tetsuya Yamamoto    schedule 01.08.2017
comment
Что такое тип данных?   -  person ccalboni    schedule 01.08.2017
comment
это элемент модели как десятичное поле   -  person beginner    schedule 01.08.2017
comment
@TetsuyaYamamoto эти варианты мне здесь не помогают. Я попробовал их.   -  person beginner    schedule 01.08.2017
comment
Можете ли вы добавить определение таблицы базы данных и оператор выбора - эта ошибка будет указывать на то, что вы не читаете десятичное значение.   -  person Scrobi    schedule 01.08.2017
comment
Я перепроверил столбец. Данные относятся к типу Decimal (18,0) в БД.   -  person beginner    schedule 01.08.2017
comment
из строки и десятичной? Не могли бы вы написать правильное сообщение об ошибке? Если да, а не и, вы имеете в виду правую колонку? 3-й столбец - десятичный?   -  person Lasse V. Karlsen    schedule 01.08.2017
comment
@LasseV.Karlsen Я проверил оператор select в своей сохраненной процедуре. Это 3-й столбец, и точное сообщение об ошибке: Тип условного выражения не может быть определен, поскольку нет неявного преобразования между строкой и десятичным числом.   -  person beginner    schedule 01.08.2017
comment
Примечание. Вы не можете добавить значение null к необнуляемому decimal. Попробуйте использовать значение по умолчанию вместо нуля, если Data равно decimal, а не decimal?: Data = varCmd.IsDBNull(2) ? (decimal)0 : decimal.Parse(varCmd.GetString(2)).   -  person Tetsuya Yamamoto    schedule 01.08.2017
comment
Примечание на будущее: будьте точны при написании своего вопроса, упомянутое сообщение об ошибке не является фактическим. Таким образом, предоставленный ответ теперь неверен.   -  person Lasse V. Karlsen    schedule 01.08.2017


Ответы (1)


Проблема вот в этой части:

Data = varCmd.IsDBNull(2) ? null : varCmd.GetDecimal(2)
                            ^-+^   ^----------+-------^
                              |               |
                              |               +-- Decimal type
                              +-- not a Decimal type

Выражение не компилируется, потому что компилятор не может сделать вывод, что для того, чтобы заставить его работать, он должен сделать последнюю часть десятичным числом, допускающим значение NULL, поэтому он пытается найти тип, который может содержать null, приземляется на string и таким образом сообщение об ошибке.

Вам нужно указать, что в качестве результата вы хотите получить десятичное число, допускающее значение NULL, предполагая, что Data также является десятичным числом, допускающим значение NULL.

Если это так, это будет работать:

Data = varCmd.IsDBNull(2) ? (Decimal?)null : varCmd.GetDecimal(2)

Если это не так, вам нужно решить, что хранить в Data, если столбец null (DBNull), возможно, 0:

Data = varCmd.IsDBNull(2) ? 0 : varCmd.GetDecimal(2)
person Lasse V. Karlsen    schedule 01.08.2017
comment
Data = varCmd.IsDBNull(2) ? 0 : varCmd.GetDecimal(2) возможная ошибка преобразования int в decimal. Data = varCmd.IsDBNull(2) ? (decimal)0 : varCmd.GetDecimal(2) обеспечивает одинаковый тип данных как для истинных, так и для ложных условий. - person Tetsuya Yamamoto; 01.08.2017
comment
Нет, 0 автоматически преобразуется в десятичный, поэтому результирующий тип является десятичным. Вся проблема здесь проистекает из того факта, что тернарный оператор не может иметь разные типы для двух своих результирующих выражений. Использование 0 фактически будет использовать внутреннюю константу Decimal.Zero, так что это совершенно безопасно. - person Lasse V. Karlsen; 01.08.2017