各位,在下现在遇到一个难题,TClientDataSet的存储性能太低
目的是:从源读取数据向目标表更新数据。现采用TClientDataSet来实现
有以下情况1、读取源表的一条记录
2、从目标库中查找到与源表当前记录的主键相同的记录,并取到TClientDataSet缓存中
3、将源表中查找到的记录替换目标表对应的记录
4、保存目标表
其中源表和目标表结构完全一样
1-3步速度很快,但第4步速度较慢,因为需要向目标库中提交数据。
如果采用以上方法,则每在目标表中查找到与源表对应的记录,就要每行都提交一遍,如果目标表有仅仅几千条记录,性能就很差了。
现在需要想个办法,让程序每更新100条记录,然后再向目标库中提交1次,这样就可以避免每行都提交,可提高几十倍的速度。
我是这样实现的://ClientDataSet1:源表
//ClientDataSet2:目标表,Provider是:DataSetProvider//获取所有源表数据。
ClientDataSet1.Close;
ClientDataSet1.Open;//在目标表中,通过SQLQuery,获取了与源表当前记录的主键值相同的记录,假设每次都可以在目标表中找到一条对应记录
SQLQuery.SQL.Text='select * from ****';
SQLQuery.Open;
//将数据DataSetProvider中的数据(就是查找到的目标表的数据)添加到ClientDataSet2中
ClientDataSet2.AppendData(DataSetProvider.Data, True);//移动到最后一行,编辑数据,将源数据更新到目标表中
ClientDataSet2.Last;
ClientDataSet2.Edit;
ClientDataSet2.Fields[0].Value := ClientDataSet1.Fields[0].Value;
ClientDataSet2.Fields[1].Value := ClientDataSet1.Fields[0].Value;
ClientDataSet2.Post;//重复以上步骤,直到目标表更新了100条记录后,再将数据提交到数据库中
ClientDataSet2.ApplyUpdates(-1)就在提交数据的时候出现了错误,试了很多便都不行,根本不能提交到目标数据库中,一直不知该如何处理,急盼高手能给以解答,谢谢!!!
目的是:从源读取数据向目标表更新数据。现采用TClientDataSet来实现
有以下情况1、读取源表的一条记录
2、从目标库中查找到与源表当前记录的主键相同的记录,并取到TClientDataSet缓存中
3、将源表中查找到的记录替换目标表对应的记录
4、保存目标表
其中源表和目标表结构完全一样
1-3步速度很快,但第4步速度较慢,因为需要向目标库中提交数据。
如果采用以上方法,则每在目标表中查找到与源表对应的记录,就要每行都提交一遍,如果目标表有仅仅几千条记录,性能就很差了。
现在需要想个办法,让程序每更新100条记录,然后再向目标库中提交1次,这样就可以避免每行都提交,可提高几十倍的速度。
我是这样实现的://ClientDataSet1:源表
//ClientDataSet2:目标表,Provider是:DataSetProvider//获取所有源表数据。
ClientDataSet1.Close;
ClientDataSet1.Open;//在目标表中,通过SQLQuery,获取了与源表当前记录的主键值相同的记录,假设每次都可以在目标表中找到一条对应记录
SQLQuery.SQL.Text='select * from ****';
SQLQuery.Open;
//将数据DataSetProvider中的数据(就是查找到的目标表的数据)添加到ClientDataSet2中
ClientDataSet2.AppendData(DataSetProvider.Data, True);//移动到最后一行,编辑数据,将源数据更新到目标表中
ClientDataSet2.Last;
ClientDataSet2.Edit;
ClientDataSet2.Fields[0].Value := ClientDataSet1.Fields[0].Value;
ClientDataSet2.Fields[1].Value := ClientDataSet1.Fields[0].Value;
ClientDataSet2.Post;//重复以上步骤,直到目标表更新了100条记录后,再将数据提交到数据库中
ClientDataSet2.ApplyUpdates(-1)就在提交数据的时候出现了错误,试了很多便都不行,根本不能提交到目标数据库中,一直不知该如何处理,急盼高手能给以解答,谢谢!!!
解决方案 »
- RAVE报表分组打印时,若有一序号列,要使每组的序号从1开始记数,应该怎么做
- 请问有关取ASCII码值的问题
- 关于SaveDialog的默认路径问题???
- 有关VclSkin的问题,如何在窗体更新时,背景为不透明。因为刷新窗体时,出现很多的闪动,反正很乱。请大家帮忙。
- 豁出去了,400分求助?
- 请教高手指点迷津,高分回报,关于tfielddef.datatype
- 有无人做过就样的界面啊?
- 谁能给一个java(client)和delphi(server)通信的example,马上给分!!
- 请教一个关于DBGRID的问题!对了立刻结贴给分30!
- 如何判断Dialup拨号已经连接成功。
- ADO处理TDareTime的问题
- 为什么那些来了一年的有一颗星了,我还是一个角!!! :(
但应该有一个错误提示的呀,是什么呀?
我猜的,不知道是不是你的clientdataset1还是事务当中,对表进行了锁定,以致不能更新?
SQLQuery.SQL.Text='select * from ****';
每次回到这一步骤的时候,ClientDataSet2的内容是不是就变了呀?所以提交不上去
直接从ClientDataSet1一次性读出100条纪录,然后直接添加到ClientDataSet2中,最后提交不就完了?
源读取数据向目标表更新 这种方法在我们的系统中就必须得这样做