C#中两行DataTable之间的计算

时间:2010-09-03 06:39:25

标签: c# datatable datarow

我有数据表,其中附有两个表。我有很多行,其中有两行是Total和Rate。(注意这是我的Datatable中的行)。我想通过乘以两行来计算总金额。我该怎么做数据表来自sql Compact,我无法进行计算,因为根据必须完成的某些设置,并不总是需要它。它甚至可以是百分比计算或任何事情。有没有办法在datatable中的2行之间进行计算?我正在使用C#。我尝试过计算功能,但无法实现。该表可能如下所示:

标题Prod1 Prod2 Prod3        10 20 30        0 20 10        5 6 0        50 0 0 总计65 46 40 费率10 20 10 金额650 920 400

,即总和= Prodi的总和,i = 1,2,3
和金额=总计*费率。 应该有一些方法来实现这一目标。我该怎么办?

提前致谢。

1 个答案:

答案 0 :(得分:1)

你能做的是:

  1. 从数据库中获取数据到数据表
  2. 从结果
  3. 中选择Rate和Total两行
  4. (如果您不需要显示它们,请从表格中删除这些行)
  5. 根据两行中的值进行计算
  6. 手动为表格添加新行
  7. 修改
    也许我没有完全理解你的数据结构。那么让我们来看看一些场景。如果您不在那里,请提供有关数据表中某一行的实际情况的详细信息:

    案例a :数据存储在列中,您还需要该行中的总计和金额列

    Value1 Value2 Value3 Rate Total Amount
    1      5      3      10     ?     ?
    

    您可以按如下方式调整SQL语句:

    SELECT Value1, Value2, Value3, Rate, 
           (Value1+Value2+Value3) AS Total, 
           ((Value1+Value2+Value3) * Rate) AS Amount 
    FROM <table>
    

    或者,如果您在C#中使用类型化数据集,则可以使用普通SELECT * ...语句,并将具有相应表达式(Expression属性 - 相当于计算列的列)的列手动添加到您键入的数据集中的表。

    案例b :数据存储在行中,您希望总计和金额也是行

    RowTitle Value
    Value1   1
    Value2   5
    Value3   2
    Rate     10
    

    现在你需要在C#中使用for循环迭代所有行,总结值然后用RowTitle“Total”和“Amount”创建两个新行并将它们添加到你的表中

    编辑2
    您,我从您的第二条评论中了解到您实际上在数据库中有两个表。一个包含实际数据,另一个包含费率。您现在可以根据用户定义的设置从这些表中进行选择,实际上您在C#中的数据集中有两个表 - 一个用于该数据,一个用于速率。

    AFAIK SQL Server Compact Edition不允许您使用JOIN,但这本来是最简单的:从数据表中选择数据并将其加入“费率”表,选择相应的费率根据用户设置。然后你可以进行我在上面“案例a”中记录的计算。

    但是,我认为你不能使用JOIN,所以我建议你将数据输入你的应用程序(产生两个单独的表,一个用于数据,一个用于速率)。您修改了数据SELECT声明,以便获得一个默认值为Amount的其他列0

    SELECT *, 0 AS Amount FROM <data table>
    

    然后,在C#中,您遍历数据表中的所有记录,并计算记录的Amount值。

    private void GetData(...)
    {
        // Call SELECT statements to fill a dataset with two tables
        DataSet set = new DataSet();
        ....
    
        // set now contains tables[0] (for the data) and tables[1] (for the Rate).
        // Get the Rate
        int rate = (int)set.Tables[1].Rows[0]["Rate"]; // Assuming that the column is named "Rate"
    
        // Now iterate over all data rows and calculate amount
        foreach (DataRow row in set.Tables[0])
        {
            row["Amount"] = ((int)row["Total"] * rate);
        }
    
        // Mark the data set as unmodified
        set.AcceptChanges();
    }
    

    请注意,此代码可能需要一些调整 - 我实际上没有测试过它。如果“Rate”-Table包含多行并且需要根据其他设置选择正确的速率,您可以考虑根据这些设置创建一个返回正确行的函数:

    private DataRow FindRateRow(DataSet set, <parameters for selecting the correct row>)
    {
        DataRow[] row = set.Tables[1].Select(<Filter string according to parameters>);
        if (row != null && row.Length > 0)
            return row[0];
        return null;
    }
    

    使用上面的int rate = (int)FindRateRow(set, ...)["Rate"];