Как правильно преобразовать элемент в DataSet, если он потенциально может быть нулевым?

У меня есть набор данных, возвращаемый хранимой процедурой, и один из элементов в нем потенциально может быть нулевым. Я пытаюсь преобразовать каждую строку в наборе данных в строго типизированный объект, но я не могу правильно указать нулевое значение.

Я создал макет моего сценария следующим образом:

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("Name", typeof(string));
ds.Tables[0].Columns.Add("Amount", typeof(decimal));
ds.Tables[0].Rows.Add("My Name Here", null); //create row with a null item

DataRow dataRow = ds.Tables[0].Rows[0];

Person p = new Person
{ 
    Name = (string)dataRow["Name"], 
    Amount = (decimal)dataRow["Amount"]
}

К сожалению, я получаю следующее исключение: System.InvalidCastException: Specified cast is not valid.

Если я попытаюсь использовать тип, допускающий значение NULL (десятичный?), я получаю эту ошибку: System.NotSupportedException: DataSet does not support System.Nullable<>.

В отладчике я провел следующие проверки значения в dataRow["Amount"]:

dataRow["Amount"] is decimal (false)
dataRow["Amount"] is decimal? (false)
dataRow["Amount"] == null (false)
dataRow["Amount"] is object (true)

Все, что я могу установить, это то, что это какой-то объект... который не особенно полезен.

Может ли кто-нибудь из вас заметить, что я делаю неправильно?


person mezoid    schedule 16.03.2009    source источник


Ответы (3)


Вы можете использовать dataRow.IsNull("Amount") или Convert.IsDBNull(dataRow["Amount"]) или (dataRow["Amount"] as Decimal) != null.

person hvintus    schedule 16.03.2009
comment
Спасибо за это! Я не понимал, что он возвращает DBNull. - person mezoid; 17.03.2009
comment
Вы не можете сделать dataRow["Amount"] as Decimal. Десятичные числа — это типы значений, поэтому они никогда не могут быть нулевыми, и их нельзя использовать с as. dataRow["Amount"] is Decimal будет эквивалентным вариантом. - person Buh Buh; 16.05.2013
comment
Сделайте это: (dataRow["Amount"] as decimal?) != null - person bahramzy; 20.06.2017

Вы также можете проверить, возвращается ли Null базой данных, как:

if (dataRow["Amount"] is System.DBNull.Value)

Это должно позволить вам проверить значение, прежде чем пытаться его привести, чтобы избежать этого сообщения об ошибке.

person ChrisHDog    schedule 16.03.2009

Вы пытались использовать decimal.TryParse?

As in:

decimal result;

if (decimal.TryParse(dataRow["Amount"].ToString(), out result))
{
//do something
}
person James_2195    schedule 16.03.2009