2013-02-15 86 views
1

我都有数据表含少量行像下面的DataTable Column.Expression掷错误

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的值为零,所以我需要在运行时添加具有不同表达式的动态列,如何避免这种类型的错误,请点击帮助。

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

+1

那么你想,当你除以零发生什么呢? – 2013-02-15 09:56:49

+0

这是C#还是VB的问题? – CloudyMarble 2013-02-15 09:57:01

+0

这是VB代码吗? – 2013-02-15 09:57:24

回答

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) 
+0

不确定这将永远不会工作。首先,我认为这个异常将会出现在添加时不在列的建立处,第二个零值仅在某些行中,并且您尝试为整列添加默认值 – Steve 2013-02-15 10:12:21

+0

@Steve Humm ...你是对。思考...... – SysDragon 2013-02-15 10:14:31

1

Expression语法允许使用IIF语句
你可以使用这种语法的表达

col = New DataColumn("VCH1", GetType(Decimal), "IIF(CH5 = 0, 0, (CH1+CH2+ch3)/CH5)") 

当然建立您的DataColumn,作为表达式的字符串正确你可以根据你现在的特定要求动态地建立你的表情。通过IIF或ISNULL,您可以在添加列前快速创建您的字符串。事情是这样的伪

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

表达式会更复杂一点,因为OP说公式是动态的。 – SysDragon 2013-02-15 10:16:43

+0

我的问题是表达式是动态的,这是(CH1 + CH2 + CH3)/ CH5之一,例如 – Pranav1688 2013-02-15 10:18:37

+0

我得到了先生的想法。史蒂夫,但希望OP得到':D' – spajce 2013-02-15 10:26:03

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