散分了,ado.net讨论关于批量修改数据提交的合理解决方案 根据对记录的操作类型,生成相应的sql脚本,然后批量执行sql脚本。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在项目中,经常会碰到,需要批量修改同条件下的数据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多条一组的话还是比较快的 我常用第一种.效率很高... 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可以达到目的,但都有局限性,不知各位有没有高招可以应付的。。 http://www.cnblogs.com/Enoch/articles/1708580.html 第一种常用~我也用过把数据转为HTML,然后来处理的,那样效率提高千倍以上 在程序如何实现类似于51job上选择地区那样的功能效果? C#调用TCC编译器,如何把C语言编译成exe文件?急! 求一解决方案 C# winform 的问题 高手速来 急急急~~~ datagridview的样式问题 求C#模拟网页自动注册 Test和Debug调试有什么区别啊!!!! 有人用过xtragrid吗? C#有没有串口控件,如何用C#的程序从串口输出数据? FckEditor 中如何在光标处插入文本 一条sql 面试题~~,求解~ 请问C#中有动态代码技术吗?
1.可以通过适配器,DATASET的UPDATE方法来批量修改数据;
这个方法比较常用,尤其是在一个支持多行同时进行编辑的情况下。
2.循环记录集,逐条修改记录;
这个方法,我比较少用,因为你修改本地记录集后,还是必须用方法1去update到后台,否则都在本地。
3.每次删除旧的数据,然后插入新数据;
如果数据时覆盖更新的,那么这是可以考虑的一种方法,但是我觉得delete+insert的效率应该不如直接update来得快?
4.给每条记录一个状态,然后遍历记录集,判断状态为UPDATE,则修改当前记录,状态为ADD,则插入当前记录,为DELETE则删除当前记录,为NONE则不处理当前记录;
似乎不需要去记录状态,每条DataRow都有一个RowState记录了。这种更新方式好像也比较少用。比较常见的是,通过GetChanges方法获取修改的那部分数据,部分更新到后台数据库。
我倾向于在程序里组织出update,insert各一组sql,再更新
2000多条一组的话还是比较快的
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);
}
}
2.性能不好;
3.没必要,实际上update语句就包含了delete+insert操作了。
4.有无必要这样设计?那样的话表里其实很多无用数据,如果很庞大的表比如2,3g,然后有聚集索引,每次更新都要重新排序,非常耗时间的。如果不需要保留旧数据就直接update。
跟
发起数据更新请求的代码(UI部分)
是否是隔离的(进程隔离, 机器隔离)?数据集中的表如何跟库中的表对应的, 是否有机制生成增删改语句?所用的ado.net 驱动和数据库产品是否支持真正的批量更新(数据跟服务器只发生一次交互).
我也用过把数据转为HTML,然后来处理的,那样效率提高千倍以上