1

以下のようないくつかの行を含むデータテーブルがあります

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 の値がゼロであるため、実行時に別の式で動的列を追加する必要があります。このようなタイプのエラーを回避するには、アイデアがあれば助けてください。

式の値が固定されていません。ユーザーは動的列の式を作成します。ゼロ除算エラーを処理するだけでなく、あらゆる種類の計算エラーを処理する

4

3 に答える 3

1

をキャッチして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)
于 2013-02-15T10:04:17.393 に答える
1

の構文では、IIF ステートメントを使用できます。
式のこの種の構文を使用して、DataColumn を構築できます。

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)
于 2013-02-15T10:14:49.853 に答える
0

問題を解決するための拡張機能を 1 つ作成するだけです。時間はかかりますが、問題はありません

<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
于 2013-02-15T11:53:18.567 に答える