如果DataSet中的项可能为null,我如何正确地转换它?

时间:2009-03-16 22:58:43

标签: c# casting null dataset

我有一个由存储过程返回的数据集,其中一个项可能为null。我正在尝试将数据集中的每一行转换为强类型对象,但我似乎无法正确转换空值。

我创建了一个模拟我的场景如下:

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.

如果我尝试使用可空类型(十进制?),我会收到此错误: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)

我所能确定的是它是某种对象......这不是特别有帮助。

你们有没有发现我做错了什么?

3 个答案:

答案 0 :(得分:6)

您可以使用dataRow.IsNull("Amount")Convert.IsDBNull(dataRow["Amount"])(dataRow["Amount"] as Decimal) != null

答案 1 :(得分:1)

您还可以检查数据库返回的Null为:

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

这应该使您能够在尝试强制转换之前检查该值,以避免出现该错误消息。

答案 2 :(得分:1)

您是否尝试过使用decimal.TryParse?

如:

decimal result;

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