Vb.net DataTable列。表达式抛出错误

Vb.net DataTable列。表达式抛出错误,vb.net,winforms,datatable,Vb.net,Winforms,Datatable,我有一个数据表,其中包含的行很少,如下所示 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)/CH

我有一个数据表,其中包含的行很少,如下所示

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有零值, 但我需要在运行时添加具有不同表达式的动态列,如何避免此类错误任何想法请帮助

表达式值不固定,用户为动态列创建表达式。
不仅处理被零除错误,要处理所有类型的计算错误

您可以捕获
被零除异常
,然后分配所需的值:

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)

您可以捕获
除以零异常
,然后分配所需的值:

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)
语法允许使用IIF语句
您可以为表达式使用这种语法来构建DataColumn

col = New DataColumn("VCH1", GetType(Decimal), "IIF(CH5 = 0, 0, (CH1+CH2+ch3)/CH5)")
当然,作为一个字符串属性的表达式,您可以根据当前的特定需求动态构建表达式。使用IIF或ISNULL,您可以在添加列之前动态构建字符串。类似这样的伪代码

Dim currentExpression as String = BuildCurrentExpression() 
col = New DataColumn("VCH1", GetType(Decimal), currentExpression)
语法允许使用IIF语句
您可以为表达式使用这种语法来构建DataColumn

col = New DataColumn("VCH1", GetType(Decimal), "IIF(CH5 = 0, 0, (CH1+CH2+ch3)/CH5)")
当然,作为一个字符串属性的表达式,您可以根据当前的特定需求动态构建表达式。使用IIF或ISNULL,您可以在添加列之前动态构建字符串。类似这样的伪代码

Dim currentExpression as String = BuildCurrentExpression() 
col = New DataColumn("VCH1", GetType(Decimal), currentExpression)

只需创建一个扩展来解决我的问题,这需要一段时间,但我没有问题

<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

将(值作为DataTable,exp作为String,inputColumn作为String)计算为DataTable的公共函数
Dim tempdt作为新数据表
tempdt=value.Clone
tempdt.Columns(inputColumn).Expression=exp
对于value.Rows.Cast(属于DataRow.ToList)中作为DataRow的每一行
尝试
tempdt.Rows.Add(row.ItemArray)
value.Rows(value.Rows.IndexOf(row))(inputColumn)=tempdt.Rows(0)(inputColumn).ToString
tempdt.Rows.Clear()
特例
tempdt.Rows.Clear()
value.Rows(value.Rows.IndexOf(row))(inputColumn)=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

将(值作为DataTable,exp作为String,inputColumn作为String)计算为DataTable的公共函数
Dim tempdt作为新数据表
tempdt=value.Clone
tempdt.Columns(inputColumn).Expression=exp
对于value.Rows.Cast(属于DataRow.ToList)中作为DataRow的每一行
尝试
tempdt.Rows.Add(row.ItemArray)
value.Rows(value.Rows.IndexOf(row))(inputColumn)=tempdt.Rows(0)(inputColumn).ToString
tempdt.Rows.Clear()
特例
tempdt.Rows.Clear()
value.Rows(value.Rows.IndexOf(row))(inputColumn)=0
继续
结束尝试
下一个
返回值
端函数

那么,当你被零除时,你希望发生什么?这是C#还是VB问题?VB,而不是零或空。你可以检查CH5,如果它为空或0,用1替换它,会有帮助吗?如果是0或null,它将除以1,留下column=columnZero之和的值出现在任何列中,并且表达式是不固定的,比如“(CH1+CH2)/(CH3-CH4)”那么当你除以零时,你想发生什么?这是C#还是VB问题?VB,而不是零或null你可以检查CH5,如果它是null或0,用1替换它,会有帮助吗?因此,在0或null的情况下,它将除以1,留下column=columnZero的和的值出现在任何列中,并且表达式不是固定的,比如“(CH1+CH2)/(CH3-CH4)”不确定这是否会起作用。首先,我认为异常将在添加时抛出,而不是在构建列时抛出,其次,零值仅在某些行中出现,您尝试为完整列添加默认值,但不确定这是否会起作用。首先,我认为异常将在添加时抛出,而不是在构建列时抛出,其次,零值仅在某些行中,并且您尝试为整列添加默认值。表达式将稍微复杂一些,因为OP说公式是动态的。我的问题是表达式是动态的,这是(CH1+CH2+ch3)/我的问题是表达式是动态的,这是(CH1+CH2+ch3)/CH5一个e.gI得到了史蒂夫先生的想法,但希望OP得到它
:D
表达式会更复杂一些,因为OP说公式是动态的。我的问题是表达式是动态的,这是(CH1+CH2+ch3)/CH5一个e.gI得到了史蒂夫先生的想法,但希望OP得到它
:D