我的数据表包含少量行,如下所示
CH1 CH2 Ch3 CH4 CH5
1 2 1 2 3
3 3 1 2 3
3 3 1 1 2
1 3 3 3 3
1 2 3 3 0
3 3 1 2 0
3 3 1 1 2
然后我尝试添加新列,如
Dim col As New DataColumn("VCH1", GetType(Decimal),"(CH1+CH2+ch3)/CH5")
DtReadings.Columns.Add(col)
当时给我错误:试图除以零。因为CH5有零值, 但我需要在运行时添加不同表达式的动态列,如何避免这种类型的错误任何想法请帮助。
表达式值未修复,用户为动态列创建表达式。 不仅处理除零错误,还要处理所有类型的计算错误
答案 0 :(得分:1)
Expression语法允许使用IIF语句
您可以使用Expression
col = New DataColumn("VCH1", GetType(Decimal), "IIF(CH5 = 0, 0, (CH1+CH2+ch3)/CH5)")
当然,作为Expression一个字符串属性,您可以根据您当前的特定要求动态构建表达式。使用IIF或ISNULL,您可以在添加列之前动态构建字符串。像这样的伪代码
Dim currentExpression as String = BuildCurrentExpression()
col = New DataColumn("VCH1", GetType(Decimal), currentExpression)
答案 1 :(得分:0)
您可以捕获DivideByZeroException
,然后指定所需的值:
Try
col = New DataColumn("VCH1", GetType(Decimal), "(CH1+CH2+ch3)/CH5")
Catch ex As DivideByZeroException
col = New DataColumn("VCH1", GetType(Decimal), "0")
End Try
DtReadings.Columns.Add(col)
答案 2 :(得分:0)
只需创建一个扩展来解决我的问题,这需要一段时间,但我没有问题
<Extension()>
Public Function ToCompute(value As DataTable, exp As String, inputColumn As String) As DataTable
Dim tempdt As New DataTable
tempdt = value.Clone
tempdt.Columns(inputColumn).Expression = exp
For Each row As DataRow In value.Rows.Cast(Of DataRow).ToList
Try
tempdt.Rows.Add(row.ItemArray)
value.Rows(value.Rows.IndexOf(row))(inputColumn) = tempdt.Rows(0)(inputColumn).ToString
tempdt.Rows.Clear()
Catch ex As Exception
tempdt.Rows.Clear()
value.Rows(value.Rows.IndexOf(row))(inputColumn) = 0
Continue For
End Try
Next
Return value
End Function