我有一个由存储过程返回的数据集,其中一个项可能为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)
我所能确定的是它是某种对象......这不是特别有帮助。
你们有没有发现我做错了什么?
答案 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
}