利用ado读取数据库2000条记录,
select * from tablename
执行这样简单的语句
执行是非常快的
但是当我要遍历并取出所有记录时居然非常慢
 while(!m_pRecordset->adoEOF)   
  {   
          vID   =   m_pRecordset->GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,   
          vUsername   =   m_pRecordset->GetCollect("*****");   
          vOld   =   m_pRecordset->GetCollect("****");   
          vBirthday   =   m_pRecordset->GetCollect("****");   
          m_pRecordset->MoveNext();///移到下一条记录   
  } 
2k条记录花费将近3~4秒
我发现是while(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveNext();
}
单单是这样一个循环就花费3~4秒
是不是有什么问题呀??
如果才2~3K的记录都要花去3~4秒
那上w的记录该怎么办呀?????????
希望大家指点一下,谢谢

解决方案 »

  1.   

    ADO读取速度基本上就是这个速度了,因为ADO是COM接口,COM接口本身就是为了通用性强,并不是为了速度。一般应用程序不可能遍历全部数据的,都是全页显示数据的,分页读取数据时对用户的响应时间影响不大。
      

  2.   

    把CursorLocation游标设置成客户端游标,设置CacheSize值为1000。看这样是否能提高处理速度。
    另外,GetCollect反复调用,把它的参数定义成_variant_t类型的变量,避免反复构造字符串。
      

  3.   

    慢的有点离谱  机器问题  还是数据库在外网? 
    这种代码while(!m_pRecordset->adoEOF)
    {
        m_pRecordset->MoveNext();

    按理说 1秒钟上W条记录没有任何问题 
      

  4.   

    数据库在外网
    我也考虑过
    问题是别人写的程序却很快
    我写的就是只上面那句它就很慢
    就是只运行MoveNext全部遍历一遍
    不是我其他地方,我断点调试过了
      

  5.   

    CursorLocation属性会影响速度。把你的程序连接一个本地数据库试试,看看是不是因为数据库在外网的原因
      

  6.   

    看看你的ado的相关属性设置,肯定有问题,我可以告诉你。我一直用ado访问数据库的sql、oracle检查游标类型、lock类型,很重要。
      

  7.   

    CacheSize默认是1,表示每次重服务器取1条。当网络慢是反复从服务器取数据,速度自然会下降。
      

  8.   

    我有ado文档,里面有对象的属性和方法的说明。给个邮箱我发给你。
      

  9.   

    [email protected]
    感谢朋友