我用ado访问远程服务器的sql server数据库的时候,发觉读取记录的速度特别慢,代码如下:
   try{     starttime=GetTickCount ();
    theApp .g_mdb.m_pRecordset  ->Open (varSQL ,
theApp .g_mdb .m_pConnection .GetInterfacePtr (),
adOpenDynamic ,
adLockOptimistic ,
adCmdText );   
while(!theApp .g_mdb.m_pRecordset->GetadoEOF())
{
                        theApp .g_mdb.m_pRecordset->MoveNext();                       dwRecordcount +=1;
  
}        }
catch(_com_error)
{
theApp .g_mdb.m_pRecordset ->Close ();
MessageBox ("程序出错,代码00002");
return FALSE ;
}  usetime=GetTickCount() -starttime;访问的数据库的表里面大概只有3000条记录,而符合我查询条件的大概100条,每个记录只有一个字段,大概10个字符而已。但是完成整个查询大概需要6秒。我测试过,theApp .g_mdb.m_pRecordset  ->Open 这一句之后所用的时间只是300ms,很快,就是说服务器的响应还算快。但是为什么后面的读取记录就需要那么多时间了。所以有以下几个问题:
1、m_pRecordset  ->Open的操作是否只是打开数据库,在远程查询,而得到的结果记录还没有传到本地?
2、有什么办法提高查询的效率,能一次把记录集保存到本地数组吗?如果100条记录,每个记录10个字符,正常的完成时间是多少?

解决方案 »

  1.   

    1,open的时候肯定还没有结果。
    2,试试研究一下m_pRecordset的游标方式看看有没有什么改进。总共花了6秒,的确有些不正常。你应该先在服务器端,用查询分析器执行你的查询语句,看看速度如何,虽然你的记录数不错,但如果服务器异常繁忙,或者这个表频繁被锁,速度照样会慢的。然后就是确定你本地和服务器之间的网络状况,用ping就能看个大概了,如果ping值有1000,那慢就太正常了。
      

  2.   

    ping服务器都是小于60ms的,如果我在本地用查询分析器查询远程服务器的数据库,同样的语句不用0.5秒就把结果全部列出来,但是用自己写的ado来查就要6秒(这6秒还不包括com初始化,ado组件的加载;只是从m_pRecordset  ->Open 到g_mdb.m_pRecordset->GetadoEOF()而已,如果加上com初始化等其他的操作,时间就更长)查询语句很简单的select * from mdb where pid like 'abc%'我只是想知道在一般的远程数据库查询中,从3000条记录中读取100条符合条件的,写到一个数组里面大概需要多久,每条记录不超过10个字符。假设服务器和sql server都正常?
      

  3.   

    果然是游标方式导致的,将adOpenDynamic改为adOpenForwardOnly就只需要400ms就可以完成了。
      

  4.   

    可能是游标类型类问题
    你把adOpenDynamic改成adOpenStatic或adOpenForwardOnly 试试