各位,在下现在遇到一个难题,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)就在提交数据的时候出现了错误,试了很多便都不行,根本不能提交到目标数据库中,一直不知该如何处理,急盼高手能给以解答,谢谢!!!

解决方案 »

  1.   

    出了错误
    但应该有一个错误提示的呀,是什么呀?
    我猜的,不知道是不是你的clientdataset1还是事务当中,对表进行了锁定,以致不能更新?
      

  2.   

    目标表是DB2,错误信息:[IBM][CLI Driver] CLI0126E  此时操作无效。 SQLSTATE=HY011.
      

  3.   

    用ClientDataSet1.commandtext只能实现查询、简单存储的功能,现在需要实现的目标不是这样,是如何从源表更新目标表中具有相同主键的记录数据的问题。
      

  4.   

    总觉得你的实现有问题//ClientDataSet2:目标表,Provider是:DataSetProvider//在目标表中,通过SQLQuery,获取了与源表当前记录的主键值相同的记录,假设每次都可以在目标表中找到一条对应记录
    SQLQuery.SQL.Text='select * from ****';
    每次回到这一步骤的时候,ClientDataSet2的内容是不是就变了呀?所以提交不上去
      

  5.   

    再说,源读取数据向目标表更新用这么麻烦吗?
    直接从ClientDataSet1一次性读出100条纪录,然后直接添加到ClientDataSet2中,最后提交不就完了?
      

  6.   

    ClientDataSet2的内容是变了,但是表结构没有变化
    源读取数据向目标表更新 这种方法在我们的系统中就必须得这样做