繁体   English   中英

尝试投射空值时引发异常

[英]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个选项可以进行空检查:

  1. 呼叫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"); } 
  2. 将值与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"); } 
  3. 对值进行运行时类型检查 与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM