原来的程序如下:
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 支不支持批量更新,如果支持的话,我操作得对不对?如果不对应该怎样操作?
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 支不支持批量更新,如果支持的话,我操作得对不对?如果不对应该怎样操作?
解决方案 »
- 各位老师,delphi 报表 quickrep 中的count 为什么用不了?
- 学了Delphi快一年了,如何向精通迈进,望有经验的大侠指教,顺便讲下我自己的历程
- quickreport连接问题
- 请问一个简单的问题
- 在树控件中选中节点一次后,再次点击鼠标如何判断是点在节点上还是树的空白区域上????
- 数据倒入问题!!在线等待!!急!!
- 刚开始做报表,想参考几个例子 请各位帮忙!!
- 请救:关于WebBrowser!!!急!!
- 超级菜题
- 谁介绍几本电子书(关于学习winsock的),现在好多都是c的,我队c不熟,哪有delphi的?
- 利用TABLE.POST添加记录后,如何判断是否添加成功?
- 唯一值的判断
强烈建议改用其它数据库。
可以推荐一下,Sql Server太大了。
....
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如果你照做了我相信效果就会很明显的。
自然慢~~
Dataset.RecNo 比Seek还慢?不可能吧!Seek要用找的,而设置RecNo可是直接定位呀!
我一开始是用的Locate查找,觉得慢,才换成用RecNo的,但发现还是慢。
不过楼上各位老大的方法我去试下先。
用RecNo定位再edit,Post: 9.23秒;
用Update更新: 11.34秒;由于是手动有误差,认为前两个差不多,Update是最慢的。
我也用过access,但是没有慢到你这个程度。
我的email [email protected]