请问如何向数据库表里的第二行开始循环插入数据?

zftnt 2016-12-01 12:39:59
代码如下:

DataTable orderdt = orderdal.GetRows();
DataTable buydt = buydal.GetRows();
DataTable apdt = new DataTable();//建立临时表
apdt.Columns.Add("pici");
apdt.Columns.Add("riqi");
apdt.Columns.Add("chanping");
apdt.Columns.Add("dindanshu");
apdt.Columns.Add("fahuo");
apdt.Columns.Add("danjia");
apdt.Columns.Add("dinzongjia");
apdt.Columns.Add("fazongjia");
apdt.Columns.Add("yingfuhuokuan");
apdt.Columns.Add("shifuhuokuan");
apdt.Columns.Add("yingfuyunfei");
apdt.Columns.Add("shifuyunfei");
apdt.Columns.Add("yukuan");
DataRow aprow = apdt.NewRow();
aprow["pici"] = buydt.Rows[0]["Ex1"];
aprow["riqi"] = buydt.Rows[0]["Ex2"];
aprow["chanping"] = buydt.Rows[0]["Standard"];
aprow["dindanshu"] = orderdt.Rows[0]["Qty"];
aprow["fahuo"] = buydt.Rows[0]["Qty"];
aprow["danjia"] = buydt.Rows[0]["SalesPrice"];
dinzongjia = Convert.ToDecimal(orderdt.Rows[0]["Qty"]) * Convert.ToDecimal(orderdt.Rows[0]["SalesPrice"]);
aprow["dinzongjia"] = dinzongjia;
fazongjia = Convert.ToDecimal(buydt.Rows[0]["Qty"]) * Convert.ToDecimal(buydt.Rows[0]["SalesPrice"]);
aprow["fazongjia"] = fazongjia;
//aprow["yingfuhuokuan"] = buydt.Rows[0]["BuyNote"];
aprow["yingfuhuokuan"] = dinzongjia;
aprow["shifuhuokuan"] = paydt.Rows[0]["ThisPayAmount"];
aprow["yingfuyunfei"] = Convert.ToDecimal(buydt.Rows[0]["Qty"]) * Convert.ToDecimal(buydt.Rows[0]["FreightPrice"]);
aprow["shifuyunfei"] = buydt.Rows[0]["WaybillNote"];
aprow["yukuan"] = dinzongjia - fazongjia;
apdt.Rows.Add(aprow);
for (int i = 1; i < orderdt.Rows.Count; i++)
{
DataRow aprow1 = apdt.NewRow();
aprow1["pici"] = buydt.Rows[i]["Ex1"];
aprow1["riqi"] = buydt.Rows[i]["Ex2"];
aprow1["chanping"] = buydt.Rows[i]["Standard"];
aprow1["dindanshu"] = orderdt.Rows[i]["Qty"];
aprow1["fahuo"] = buydt.Rows[i]["Qty"];
aprow1["danjia"] = buydt.Rows[i]["SalesPrice"];
aprow1["dinzongjia"] = Convert.ToDecimal(orderdt.Rows[i]["Qty"]) * Convert.ToDecimal(orderdt.Rows[i]["SalesPrice"]);
aprow1["fazongjia"] = Convert.ToDecimal(buydt.Rows[i]["Qty"]) * Convert.ToDecimal(buydt.Rows[i]["SalesPrice"]);
yingfuhuokuan = Convert.ToDecimal(paydt.Rows[i]["ThisPayAmount"]) - Convert.ToDecimal(apdt.Rows[i - 1]["yukuan"]);//从第二行数据开始根据公式(实际付款-厂家余款)计算应付款
aprow1["yingfuhuokuan"] = yingfuhuokuan;
aprow1["shifuhuokuan"] = paydt.Rows[i]["ThisPayAmount"];
aprow1["yingfuyunfei"] = Convert.ToDecimal(buydt.Rows[i]["Qty"]) * Convert.ToDecimal(buydt.Rows[i]["FreightPrice"]);
aprow1["shifuyunfei"] = buydt.Rows[i]["WaybillNote"];
yukuan = (Convert.ToDecimal(orderdt.Rows[i]["Qty"]) - Convert.ToDecimal(buydt.Rows[i]["Qty"])) * Convert.ToDecimal(buydt.Rows[i]["SalesPrice"]) + (Convert.ToDecimal(paydt.Rows[i]["ThisPayAmount"]) - Convert.ToDecimal(apdt.Rows[i]["yingfuhuokuan"]));//第二行数据开始计算余款公式为(订单数量-发货数量)*单价+(实付货款-应付货款)
aprow1["yukuan"] = yukuan;
apdt.Rows.Add(aprow1);
}

我的目的是把buydt,orderdt,paydt三个表的数据放到apdt这个临时表里去统计,现在是在for循环的yukuan变量赋值这行出错,提示在位置1处没有任何行,因为这个语句中直接取了apdt这个临时表的一个数据,我怀疑是在这里出的问题
...全文
306 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
51行最后那一个Convert.ToDecimal(apdt.Rows[i]["yingfuhuokuan"]) apdt只有1行,也就是apdt.Rows[0]["yingfuhuokuan"], 但是你的for循环里i起始就等于1了,apdt没有apdt.Rows[1]["yingfuhuokuan"] 你把for循环里改为i=0
zftnt 2016-12-01
  • 打赏
  • 举报
回复

private void Databind()
    {
        DataTable orderdt = orderdal.GetRows();
        DataTable buydt = buydal.GetRows();
        DataTable paydt = paydal.GetRows();
       
        apdt.Columns.Add("pici");
        apdt.Columns.Add("riqi");
        apdt.Columns.Add("chanping");
        apdt.Columns.Add("dindanshu");
        apdt.Columns.Add("fahuo");
        apdt.Columns.Add("danjia");
        apdt.Columns.Add("dinzongjia");
        apdt.Columns.Add("fazongjia");
        apdt.Columns.Add("yingfuhuokuan");
        apdt.Columns.Add("shifuhuokuan");
        apdt.Columns.Add("yingfuyunfei");
        apdt.Columns.Add("shifuyunfei");
        apdt.Columns.Add("yukuan");
        DataRow aprow = apdt.NewRow();
        for (int i = 0; i < orderdt.Rows.Count; i++)
        {
            aprow["pici"] = buydt.Rows[i]["Ex1"];//批次
            aprow["riqi"] = buydt.Rows[i]["Ex2"];//日期
            aprow["chanping"] = buydt.Rows[i]["Standard"];//产品型号
            aprow["dindanshu"] = orderdt.Rows[i]["Qty"];//订单数量
            aprow["fahuo"] = buydt.Rows[i]["Qty"];//发货数量
            aprow["danjia"] = buydt.Rows[i]["SalesPrice"];//订单价格
            dinzongjia = Convert.ToDecimal(orderdt.Rows[i]["Qty"]) * Convert.ToDecimal(orderdt.Rows[i]["SalesPrice"]);//订单总价
            aprow["dinzongjia"] = dinzongjia;
            fazongjia = Convert.ToDecimal(buydt.Rows[i]["Qty"]) * Convert.ToDecimal(buydt.Rows[i]["SalesPrice"]);//发货总价
            aprow["fazongjia"] = fazongjia;
            aprow["yingfuhuokuan"] = Convert.ToDecimal(orderdt.Rows[0]["Qty"]) * Convert.ToDecimal(orderdt.Rows[0]["SalesPrice"]);//应付货款只更新第一行数据
            aprow["shifuhuokuan"] = paydt.Rows[i]["ThisPayAmount"];//实付货款
            aprow["yingfuyunfei"] = Convert.ToDecimal(buydt.Rows[i]["Qty"]) * Convert.ToDecimal(buydt.Rows[i]["FreightPrice"]);//应付运费
            aprow["shifuyunfei"] = buydt.Rows[i]["WaybillNote"];//实付运费
            aprow["yukuan"] = Convert.ToDecimal(paydt.Rows[0]["ThisPayAmount"]) - (Convert.ToDecimal(buydt.Rows[0]["Qty"]) * Convert.ToDecimal(buydt.Rows[0]["FreightPrice"]));//余款只更新第一行数据
            apdt.Rows.Add(aprow);
        }

        for (int i = 1; i < orderdt.Rows.Count; i++)
            {
                DataRow aprow1 = apdt.NewRow();
                yingfuhuokuan = Convert.ToDecimal(apdt.Rows[i]["dinzongjia"]) - Convert.ToDecimal(apdt.Rows[i - 1]["yukuan"]);//从第二行数据开始根据公式(实际付款-厂家余款)计算应付款
                aprow1["yingfuhuokuan"] = yingfuhuokuan;
                yukuan = (Convert.ToDecimal(orderdt.Rows[i]["Qty"]) - Convert.ToDecimal(buydt.Rows[i]["Qty"])) * Convert.ToDecimal(buydt.Rows[i]["SalesPrice"])
                + (Convert.ToDecimal(paydt.Rows[i]["ThisPayAmount"]) - Convert.ToDecimal(apdt.Rows[i]["yingfuhuokuan"]));//第二行数据开始计算余款公式为(订单数量-发货数量)*单价+(实付货款-应付货款)
                aprow1["yukuan"] = yukuan;
                apdt.Rows.Add(aprow1);
            }
            
        this.GridView1.DataSource = apdt;
        this.GridView1.DataBind();
    }
代码运行 提示apdt.Rows.Add(aprow);这行出错,提示该行已属于此表,怎么弄?
zftnt 2016-12-01
  • 打赏
  • 举报
回复
引用 10 楼 From_TaiWan 的回复:
你的数据来源有三个datatable,第一行(row==0)好像是标题 首先理清三个表之间的联系方式(关键字,哪里是主键,哪里是外键),然后去掉标题行(数据给UI时再加),用类似我上面#8的linq写较方便 或者按照你原来的思路,注意各表对应关系
好的,我用的pici这个字段,因为三个表都是以pici为唯一值,都有对应的,所以应该不会出错
秋的红果实 2016-12-01
  • 打赏
  • 举报
回复
你的数据来源有三个datatable,第一行(row==0)好像是标题 首先理清三个表之间的联系方式(关键字,哪里是主键,哪里是外键),然后去掉标题行(数据给UI时再加),用类似我上面#8的linq写较方便 或者按照你原来的思路,注意各表对应关系
  • 打赏
  • 举报
回复
引用 7 楼 zftnt 的回复:
[quote=引用 6 楼 u011981242 的回复:] [quote=引用 3 楼 zftnt 的回复:] 是不是不能用for循环要用foreach?
拼音太多看不太清楚你的整体公式情况,不好判断用哪一个,反正不能让表格单元越界 关于你上面的说的那个公式i-1也不能越界,所以要加一个前提判断是不是第一行if(i!=0) { 公式 }[/quote] 我理了下思路,应该先把赋值弄完,也就是先for循环一次,把几个固定的值都更新到表里去,然后再foreach一遍,去根据公式赋值给剩余的几个字段,这样对不对?[/quote]表格处理前,当然要让值填充进表格内,然后再做操作,建议你填充数据和数据计算分开写,不容易错,容易维护
秋的红果实 2016-12-01
  • 打赏
  • 举报
回复
更一般的处理方法是用Linq,类似sql中的join方法,例如

var query=from t1 in orderdt.AsEnumerable()
                 join t2 in buydt.AsEnumerable() on t1.Field<string>("Key1") equals t2.Field<string>("Key2")
                 select new
                 {
                      //你的apdt里面的字段
                  }
query就相当于你的apdt表
zftnt 2016-12-01
  • 打赏
  • 举报
回复
引用 6 楼 u011981242 的回复:
[quote=引用 3 楼 zftnt 的回复:] 是不是不能用for循环要用foreach?
拼音太多看不太清楚你的整体公式情况,不好判断用哪一个,反正不能让表格单元越界 关于你上面的说的那个公式i-1也不能越界,所以要加一个前提判断是不是第一行if(i!=0) { 公式 }[/quote] 我理了下思路,应该先把赋值弄完,也就是先for循环一次,把几个固定的值都更新到表里去,然后再foreach一遍,去根据公式赋值给剩余的几个字段,这样对不对?
  • 打赏
  • 举报
回复
引用 3 楼 zftnt 的回复:
是不是不能用for循环要用foreach?
拼音太多看不太清楚你的整体公式情况,不好判断用哪一个,反正不能让表格单元越界 关于你上面的说的那个公式i-1也不能越界,所以要加一个前提判断是不是第一行if(i!=0) { 公式 }
秋的红果实 2016-12-01
  • 打赏
  • 举报
回复
for (int i = 1; i < buydt.Rows.Count; i++) { DataRow aprow1 = apdt.NewRow(); aprow1["pici"] = buydt.Rows[i]["Ex1"]; aprow1["riqi"] = buydt.Rows[i]["Ex2"]; orderdt和buydt不一定是同步的
EnForGrass 2016-12-01
  • 打赏
  • 举报
回复
计算之前先要判断是否有第二行
zftnt 2016-12-01
  • 打赏
  • 举报
回复
是不是不能用for循环要用foreach?
zftnt 2016-12-01
  • 打赏
  • 举报
回复
引用 1 楼 u011981242 的回复:
51行最后那一个Convert.ToDecimal(apdt.Rows[i]["yingfuhuokuan"]) apdt只有1行,也就是apdt.Rows[0]["yingfuhuokuan"], 但是你的for循环里i起始就等于1了,apdt没有apdt.Rows[1]["yingfuhuokuan"] 你把for循环里改为i=0
我这里有个计算公式,是某行某列的值要减去上一行某列的值,这怎么处理?代码如下:
yingfuhuokuan = Convert.ToDecimal(apdt.Rows[i]["dinzongjia"]) - Convert.ToDecimal(apdt.Rows[i - 1]["yukuan"]);//从第二行数据开始根据公式(实际付款-厂家余款)计算应付款

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧