原来的程序如下:
   for i := 0 to nLen -1 do
     DataSet.RecNo := Data[i].pos;
     DataSet.Edit;
     DataSet.FieldByName('Name').Vlaue := Data[i].Name;
     DataSet.Post;
  end;运行到是很正常,但只有三百条时就要花一二十秒,如果有几千条上万条的话简直不能想像了。
修改一条写一下数据库太慢了。不是有个 UpdateBatch可以用吗?
于是把 
DataSet.LockType := ltBatchOptimistic;
DataSet.CursorType := ctKeySet;
程序改成下面这样:   for i := 0 to nLen -1 do
     DataSet.RecNo := Data[i].pos;
     DataSet.Edit;
     DataSet.FieldByName('Name').Vlaue := Data[i].Name;
     //DataSet.Post;
  end;
  DataSet.UpdateBatch;结果只能保存最后一条记录。100分的问题来了,
ADO + Access 支不支持批量更新,如果支持的话,我操作得对不对?如果不对应该怎样操作?

解决方案 »

  1.   

    不好意思 do 后的 begin 忘记输了,我的程序实际上是有Begin 的
      

  2.   

    代码没问题,问题出在Access上,
    强烈建议改用其它数据库。
      

  3.   

    问题已经找到,用批量更新也要用到 Post,但批量更新还是慢,还有什么数据库可以用的,
    可以推荐一下,Sql Server太大了。
      

  4.   

    用update语句吧,你在客户端怎么做都不如数据库自己做快
      

  5.   

    还有一个建议,用TBDEClientDataSet,他和TClientDataSet一样有缓存数据更新的功能,然后直接用一个applyupdate(-1),就可以把所有的变更刷新到数据库中去了,比单独更新一条记录然后post一个快多了
      

  6.   

    access 虽然慢,但也不该慢到你这个程度。     DataSet.RecNo := Data[i].pos;
         ....
         DataSet.FieldByName('Name').Vlaue := Data[i].Name;
    RecNo 和 FieldByName 这两个函数都是比较耗时的。在仍然采用access的前提下,我的建议:
    1. 针对Name和RecNo列在Access里面增加索引。
    2. 使用Seek 函数替代RecNo,他会利用索引的
    3. 尽可能的使用Fields[x]来替代 FieldByName这个函数,
    4. 如果可能使用SQL来完成更新
    5. 采用缓存更新。1、2、3如果你照做了我相信效果就会很明显的。
      

  7.   

    确实用update更新,速度应该快一些
      

  8.   

    简单的说,Update针对你选择的几个字段,而Post是针对你所选的那条记录的。
    自然慢~~
      

  9.   

    我个人比较同意耙子的意见。他的办法比较通用一些。同样我如果自己做,我会使用Update SQL语句,同时给Where子句用到的字段建立唯一索引。你的办法肯定慢,首先一个定位Recno就要命的很。其实Update语句已经替你定位了,何必自己去做,还吃力不讨好?
      

  10.   

    To 耙子:
     Dataset.RecNo 比Seek还慢?不可能吧!Seek要用找的,而设置RecNo可是直接定位呀!
    我一开始是用的Locate查找,觉得慢,才换成用RecNo的,但发现还是慢。
    不过楼上各位老大的方法我去试下先。
      

  11.   

    Locate 是很慢的,因为它不能利用索引。
      

  12.   

    最后用手机的秒表功能简单的测试了一下速度:用Locate定位再edit,Post:  9.18秒;
    用RecNo定位再edit,Post:   9.23秒;
    用Update更新:            11.34秒;由于是手动有误差,认为前两个差不多,Update是最慢的。
      

  13.   

    如果方便,你把程序发给大家,让大家帮你改。
    我也用过access,但是没有慢到你这个程度。
    我的email [email protected]
      

  14.   

    用sql语句来实现更新,就可以实现批量更新了。