delphi与sql server2000连接采用bde还是ado好?next后死循环?丢数据?

gardenyang 2003-05-07 06:10:00
我做了一个程序前台采用delphi6后台使用sql server2000,开始采用BDE做数据库连接,但是出现了一些很奇怪的问题。
首先我用table来处理批量修改数据的功能,后来发现处理数据必须要求数据按照某种既定的顺序排列,因此使用了table的indexfieldname属性,来控制数据的排序,但是发现排序后的数据陷入了死循环,当到了某一条数据后table.next方法就不能准确定位到下一条数据,而是在当前数据开始循环。这个问题在采用paradox7数据库的时候就发现过,但是当时我用别的办法绕过了数据排序的问题。但是这一次不能绕过。
后来我采用query控件,并且将requestalive属性修改后使他能够接受数据的修改,而且能够根据我的要求开始任意排序,但是这次发现了根奇怪的问题。就是某些数据永远也无法遍历到,当query.eof=true的时候有一些数据仍然没有处理过,具体纪录处理日志后发现当query.next的时候有一些数据丢失了。
无奈之下采用adoconnection和adotable,adoquery但是发现上述问题仍然存在,而且还出现了一个新的问题,就是数据处理速度当数据量超过一定数量后整个程序的运行效率突然降到很低,速度极慢。
有没有那位高手能够指点迷津,解决数据无法遍历,next时死循环,ado数据处理极慢的问题???
非常感谢!!!
...全文
62 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gardenyang 2003-05-09
  • 打赏
  • 举报
回复
问题还是没有解决,算了,不等了,如果那为仁兄有了解决方案请给我发email
gardenyang@sina.com,谢谢!先把分给了再说吧!谢谢众位了!!!
gardenyang 2003-05-09
  • 打赏
  • 举报
回复
我已经知道问题了,但是还没有解决
我在修改数据的时候修改了当前使用的索引,而query可能是动态获取数据,因此中间跳过了一些数据。而table则因为索引改动陷入了死循环
gardenyang 2003-05-08
  • 打赏
  • 举报
回复
cachesize有建议值吗?
我一直不知道prepared有什么作用,能告诉我吗?
hnhb 2003-05-08
  • 打赏
  • 举报
回复
ADO处理数据量大会变慢的问题有多种可能,不是一下子说得清的,楼上有人建议你用存储过程是一个很好的解决办法.如果你不用存储过程的话,那也要用Prepared的AdoDataSet或Prepared的AdoQuery,AdoQuery和AdoDataSet的Prepared的属性值默认是False,在不带子查询的情形下,最好把Prepared的属性改成Prepared.或者在AdoQuery执行Open前加一句AdoQuery1.Prepared;
还有就是要设好CacheSize值,这也是一个很重要的属性值
gardenyang 2003-05-07
  • 打赏
  • 举报
回复
还是这里好,我在别的论坛问了这个问题,一直没有人回答,真没想到这里人气这么旺!看来我得随时关注这个板块了!前面帮忙的几位仁兄,非常感谢,但是我的问题还是没有解决。其实这个问题我碰到很长时间了,而且我向delphi官方网站也咨询过,始终没能解决!
众位仁兄多多帮忙,谢谢了!
gardenyang 2003-05-07
  • 打赏
  • 举报
回复
我的数据库服务器是win2000,客户端也是win2000 pro

for i :=0 to Query.recordcount-1 do
begin
//插入你要作的事情,
end;
我想知道怎么到下一条记录?

我这个现象是极其偶尔的出现,而且是当一次批量处理数据超过10万条记录后频繁出现,我换了很多种处理方式都没办法避免这种概率很小的错误。
那位高手指点一下,谢谢!
xiaoyuer0851 2003-05-07
  • 打赏
  • 举报
回复
强烈建议使用 ado 进行连接!~~~

for i :=0 to dbgrid1.datasource.dataset.recordcount -1 do
begin
//插入你要作的事情,
end
stargazer 2003-05-07
  • 打赏
  • 举报
回复
我现在作的项目,用D6+Ado2.6+SQL 7,遍历4000多条记录,没有发现你说的问题。
CloneCenter 2003-05-07
  • 打赏
  • 举报
回复
如果数据处理可以使用存储过程来做的话,尽量使用存储过程,这样可以提高速度,而且对客户端的压力小,就是可能处理数据的方法函数就不是很多了,控制起来可能不是很方便而已。
dolphin2001 2003-05-07
  • 打赏
  • 举报
回复
我个人觉得使用ADO效率会好些,而且这是趋势。。。
至于你使用NEXT,陷入死循环,是不是你没有定义好循环的条件,在循环体中,执行NEXT后,加上一句 Application.ProcessMessage ;
我想问下楼主,你用ADO连接SQL Server是选择什么驱动?可能与你选择的ADO 驱动有关,最好选择 Microsoft Ole DB Provider for SQL Server。你的SQL Server服务器最好安装在NT(4.0或2000)的操作系统上。
gytyl 2003-05-07
  • 打赏
  • 举报
回复
你将query.eof这里改下
写成这样的
for i :=0 to Query.recordcount-1 do
begin
//插入你要作的事情,
end;
这样看看,应该不会漏数据的。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧