【问题标题】:ADO.net Datatable iterating through a column of each data rowADO.net Datatable 遍历每个数据行的列
【发布时间】:2014-03-18 17:18:15
【问题描述】:

我有一个存储过程返回 4 个不同的表,所以我创建了四个不同的数据表对象

DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
DataTable dt3 = ds.Tables[2];
DataTable dt4 = ds.Tables[3];

第二个表dt2包含两列地址和完成

address1................12

address2.................9

address3................14

address4................13

我想遍历第二个数据表并添加所有完成的值并将其存储在局部变量 comp 我的解决方案如下

int comp = 0;
foreach (DataRow dr in dt2.Rows)
{
    object o = dr["Completed"];
    comp =+ Convert.ToInt32(o);
}

comp 的输出是 13 但它应该是最后一列第二个数据表的总和的 48,任何想法

【问题讨论】:

    标签: asp.net datatable ado.net


    【解决方案1】:

    您使用错误的运算符进行加法赋值您需要+= 而不是=+。您拥有=+ 的运算符意味着您拥有带有+Convert.ToInt32(o) 的+ 一元加法运算符,结果分配给object o

    comp =+ Convert.ToInt32(o);
    

    意思

    comp = +Convert.ToInt32(o); Addition operator will be considered unary operator with Convert.ToInt32(o)
    

    你的代码是

    foreach (DataRow dr in dt2.Rows)
    {
    
        object o = dr["Completed"];
        comp += Convert.ToInt32(o);
    }
    

    如果 += 或 -= 运算符的左操作数被归类为事件 访问,则表达式计算如下:

    • 评估事件访问的实例表达式(如果有)。
    • 计算 += 或 -= 运算符的右操作数,并在需要时通过 隐式转换(第 6.1 节)。
    • 调用事件的事件访问器,参数列表包含正确的操作数,在评估之后,如果需要, 转换。如果运算符是 +=,则调用 add 访问器。如果 运算符为 -=,调用了删除访问器 MSDN

    【讨论】:

      【解决方案2】:

      阿迪尔有rightly pointed out to the mistake,你也可以用LINQ To DataSet/DataTable来计算SUM,比如:

      int comp = dt2.AsEnumerable()
                    .Sum(r => r.Field<int>("Completed"));
      

      或者你可以使用DataTable.Compute 喜欢:

      int comp = Convert.ToInt32(dt2.Compute("Sum(Completed)", ""));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多