当前位置:编程学习 > C#/ASP.NET >>

散分了,ado.net讨论关于批量修改数据提交的合理解决方案

在项目中,经常会碰到,需要批量修改同条件下的数据
1.可以通过适配器,DATASET的UPDATE方法来批量修改数据;
2.循环记录集,逐条修改记录;
3.每次删除旧的数据,然后插入新数据;
4.给每条记录一个状态,然后遍历记录集,判断状态为UPDATE,则修改当前记录,状态为ADD,则插入当前记录,为DELETE则删除当前记录,为NONE则不处理当前记录;

如果您在项目中使用了哪个方案,或者有更好的解决方案,都来评论一下,希望能分享一下各自的经验!互相学习了。散分 --------------------编程问答-------------------- 根据对记录的操作类型,生成相应的sql脚本,然后批量执行sql脚本。 --------------------编程问答-------------------- 1与2。 --------------------编程问答-------------------- 如果批量修改的数据里面需要增加一部分新记录,修改一部分旧记录,删除一部分旧记录;
第二种方案是办不到的,只有用1、3、4了,都来讨论下啊 --------------------编程问答-------------------- 自己顶一下!!! --------------------编程问答-------------------- 第一种吧. --------------------编程问答-------------------- 如果需要修改的数据有其他数据与之关联,就用4
否则的话3最省心 --------------------编程问答-------------------- 一般第三个方法! --------------------编程问答-------------------- 在项目中,经常会碰到,需要批量修改同条件下的数据
1.可以通过适配器,DATASET的UPDATE方法来批量修改数据;
这个方法比较常用,尤其是在一个支持多行同时进行编辑的情况下。
2.循环记录集,逐条修改记录;
这个方法,我比较少用,因为你修改本地记录集后,还是必须用方法1去update到后台,否则都在本地。
3.每次删除旧的数据,然后插入新数据;
如果数据时覆盖更新的,那么这是可以考虑的一种方法,但是我觉得delete+insert的效率应该不如直接update来得快?
4.给每条记录一个状态,然后遍历记录集,判断状态为UPDATE,则修改当前记录,状态为ADD,则插入当前记录,为DELETE则删除当前记录,为NONE则不处理当前记录;
似乎不需要去记录状态,每条DataRow都有一个RowState记录了。这种更新方式好像也比较少用。

比较常见的是,通过GetChanges方法获取修改的那部分数据,部分更新到后台数据库。

--------------------编程问答-------------------- 前三种方法都用过,有的时候,感觉还是看个人习惯。。 --------------------编程问答-------------------- 如果是数据源绑定的是DataSet数据集,采用第一种方法无疑是最好的;不过如果数据源绑定的是List<T>呢?如果数据需要同时处理增加,删除,修改操作,我觉得第三种方法可能更实际 --------------------编程问答-------------------- 我顶起 --------------------编程问答-------------------- 很少用到了
一般都是线下操作,然后导入了
--------------------编程问答-------------------- 感觉第三种工作量稍微大点,个人感觉哈 --------------------编程问答-------------------- 学习~~ --------------------编程问答-------------------- 大数据量的情况下,delete再insert会比较慢
我倾向于在程序里组织出update,insert各一组sql,再更新
2000多条一组的话还是比较快的 --------------------编程问答--------------------          学习、  --------------------编程问答-------------------- 1,2 --------------------编程问答-------------------- 我常用第一种.效率很高...


        public bool CommitUpdate(string sSQl, DataTable dt)
        {
            try
            {
                if (_oleConn.State != ConnectionState.Open)
                    _oleConn.Open();
                OleDbDataAdapter DA_QueryTele = new OleDbDataAdapter(sSQl, _oleConn);
                OleDbCommandBuilder cmd = new OleDbCommandBuilder(DA_QueryTele);

                DA_QueryTele.Update(dt);
                dt.AcceptChanges();
                return true;
            }
            catch (Exception err)
            {
                throw new Exception("数据更新提交失败. 失败原因: " + err.Message);
            }
        }
--------------------编程问答-------------------- 第一种比较常用吧,楼主的后几种我比较少用 --------------------编程问答-------------------- 一般用1.原因很简单,执行性能好,而且mssql下单句update语句默认是一个事务,所以数据安全性上也有保障。
2.性能不好;
3.没必要,实际上update语句就包含了delete+insert操作了。
4.有无必要这样设计?那样的话表里其实很多无用数据,如果很庞大的表比如2,3g,然后有聚集索引,每次更新都要重新排序,非常耗时间的。如果不需要保留旧数据就直接update。 --------------------编程问答-------------------- 我顶起 --------------------编程问答-------------------- --------------------编程问答-------------------- 这个问题太复杂,

执行数据更新的代码(调用 ado.net 进行库操作的),

发起数据更新请求的代码(UI部分)
是否是隔离的(进程隔离, 机器隔离)?

数据集中的表如何跟库中的表对应的, 是否有机制生成增删改语句?

所用的ado.net 驱动和数据库产品是否支持真正的批量更新(数据跟服务器只发生一次交互).


--------------------编程问答-------------------- 数据集提交时可能需要同时处理增加,删除,修改的操作,直接UPDATE是满足不了要求的,1,3,4可以达到目的,但都有局限性,不知各位有没有高招可以应付的。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 学习!!~ --------------------编程问答-------------------- 要看批量的数据有多少(1万还是100万),修改了多少(几十条还是几万条),这些修改的数据彼此间是否有关系(是否必须在一个事务里) --------------------编程问答--------------------
引用 24 楼 xiashu 的回复:
数据集提交时可能需要同时处理增加,删除,修改的操作,直接UPDATE是满足不了要求的,1,3,4可以达到目的,但都有局限性,不知各位有没有高招可以应付的。。



这里指的都是在同一事务中,如果不是同一事务,只有分开处理这个办法了 --------------------编程问答-------------------- 我顶起 --------------------编程问答-------------------- 我会用第四种方法. --------------------编程问答-------------------- 第一种 --------------------编程问答-------------------- 第一种 --------------------编程问答-------------------- 批量Update --------------------编程问答-------------------- 学习了,谢谢 --------------------编程问答-------------------- 1吧~~~~~~~~~~~~~!! --------------------编程问答-------------------- 我学习  我顶起  我接分 --------------------编程问答-------------------- http://www.cnblogs.com/Enoch/articles/1708580.html --------------------编程问答-------------------- 第一种常用~
我也用过把数据转为HTML,然后来处理的,那样效率提高千倍以上 --------------------编程问答-------------------- 用事务去处理
--------------------编程问答--------------------   支持 8 楼..........
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,