C# 当数据集中的项可能为空时,如何正确地强制转换该项?

C# 当数据集中的项可能为空时,如何正确地强制转换该项?,c#,casting,null,dataset,C#,Casting,Null,Dataset,我有一个由存储过程返回的数据集,其中的一个项可能为null。我试图将数据集中的每一行转换为强类型对象,但似乎无法正确地转换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)); d

我有一个由存储过程返回的数据集,其中的一个项可能为null。我试图将数据集中的每一行转换为强类型对象,但似乎无法正确地转换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:指定的强制转换无效。

如果尝试使用可为空的类型(十进制?),则会出现以下错误:
System.NotSupportedException:DataSet不支持System.nullable。

在调试器中,我对dataRow[“Amount”]中的值进行了以下测试:

我所能确定的是它是某种物体……这不是特别有用


你们中有谁能发现我做错了什么吗?

你们还可以检查数据库返回的Null值,如下所示:

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

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

您可以使用
dataRow.IsNull(“金额”)
Convert.IsDBNull(dataRow[“Amount”])
(dataRow[“Amount”]作为十进制)!=null

您是否尝试过使用decimal.TryParse

例如:

decimal result;

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

谢谢你!我没有意识到它返回的是一个DBNull。您不能将数据行[“Amount”]设置为十进制。小数是值类型,因此不能为null,并且不能与
as
一起使用<代码>数据行[“金额”]是十进制的将是等效选项。执行此操作:
(数据行[“金额”]是十进制的?)=空
decimal result;

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