我发现了许多与此类似的问题,但没有一个解决我的问题。我正在使用SSIS和C#脚本读取和修改Excel工作簿的样式。
我收到以下错误“无法对空引用执行运行时绑定” 。我了解错误的含义;本质上,您不能使用/引用空值。但是我以为我正在检查我的IF语句中的所有NULL。
我正在使用的代码:
int rows = xlWorkSheetTY.UsedRange.Rows.Count - 1;
Excel.Range rge = xlWorkSheetTY.get_Range("J2:J" + rows, System.Type.Missing);
foreach (Excel.Range item in rge.Cells)
{
if (item != null && (item.Value2 != null || item.Value2 != "" || item.Value2 != "NULL"))
{
decimal result = (decimal)0.00;
if (decimal.TryParse(item.Value2.ToString(), out result))
{
if (result <= 20)
{
item.Interior.Color = Excel.XlRgbColor.rgbRed;
item.Font.Color = Excel.XlRgbColor.rgbWhite;
}
}
}
}
对于我为什么会收到此错误以及我该怎么办才能纠正此问题,有人有任何建议吗?
更新:
我插入了try catch
语句,以尝试查找有关失败原因的更多详细信息。每次都在特定行上失败。我已经在原始Excel文件中查看了此行,并且数据为空。
如何防止它在不执行已有操作的情况下解析此字段-检查nulls
等?
答案 0 :(得分:1)
您的逻辑似乎有误:
if (item != null && (item.Value2 != null || item.Value2 != "" || item.Value2 != "NULL"))
假设我们有item.Value2 == null
,然后条件item.Value2 != ""
返回 true
,它将进入if块,从而导致您所描述的错误。
事实上,我认为您应该仅使用&&
,而不能使用||
:
if (item != null && item.Value2 != null && item.Value2 != "" && item.Value2 != "NULL")
答案 1 :(得分:0)
事实证明,由于item.Value2
是动态的,因此它是在运行时创建的,因此无法绑定ToString()
方法。
所以不是
if (decimal.TryParse(item.Value2.ToString(), out result))
我需要使用:
if (decimal.TryParse(Convert.ToString(item.Value2), out result))
这解决了我的问题!