[英]Exception throw when trying to cast empty value
我有一个查询,可以从DataTable
的数据库接收信息:
DataTable estimateCalculation = new DataTable();
estimateCalculation = db.ExeSQLEstimate("usp_Contracted_Calculation", param1, param2);
所以现在我得到的值是:
var averageContractedAmount = (from DataRow dr in estimateCalculation.Rows select (decimal)dr["AverageContractedAmount"]).FirstOrDefault().ToString("C");
但是在某些情况下, dr
可以为空,因此会引发异常
System.InvalidCastException:'指定的转换无效
如何验证dr
返回null,而不尝试将其转换为十进制?
我认为您需要像这样简单的东西。 如果我误解了,请澄清。 (也欢迎)
DataTable dt = new DataTable();
if (dt.Rows.Count == 0)
return;
值得一看的是DataRow.IsNull()
if (!dataRow.IsNull());
我自己没有使用过它,但是看起来它可能是您想要的理想选择。
您基本上有3个选项可以进行空检查:
呼叫DataRow.IsNull()
:
var row = (from DataRow dr in estimateCalculation.Rows select dr).FirstOrDefault(); if (row != null && !row.IsNull("AverageContractedAmount")) { var averageContractedAmount = ((decimal)row["AverageContractedAmount"]).ToString("C"); }
将值与DbNull.Value
进行比较。 请注意,当数据库中的列包含空值时, DataRow["ColumnName"]
不会返回null
而是返回DbNull.Value
。
var value = (from DataRow dr in estimateCalculation.Rows select dr["AverageContractedAmount"]).FirstOrDefault(); if (value != null && value != DBNull.Value) { var averageContractedAmount = ((decimal)value).ToString("C"); }
对值进行运行时类型检查 。 与C#7.0模式匹配语法一起使用时,这特别好:
if ((from DataRow dr in estimateCalculation.Rows select dr["AverageContractedAmount"]).FirstOrDefault() is decimal value) { var averageContractedAmount = value.ToString("C"); }
有时您不想执行if-else
分支,而只想将值转换为可为空的类型,通常使用三元条件运算符:
var averageContractedAmount =
(from DataRow dr in estimateCalculation.Rows
select (dr.IsNull("Price")
? null
: (decimal?)dr["AverageContractedAmount"])
).FirstOrDefault()
?.ToString("C");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.