热情软件屋

 

难道用CDatabase和CRecordset访问数据库这么慢吗


编号:QA003786
建立日期: 2001年1月18日 最后修改日期:2001年2月5日
所属类别:

张大力:
    操作系统:windows98
    编程工具:VC++6.0 Access ODBC
    问题:我使用CDatabase类打开数据库,用CRecordset类来读取数据,并显示到列表框(m_List)中。使用如下代码:
    CDatabase myMdb;
    // 数据库已打开......
    CRecordset tmpRS(&myMdb);
    tmpRS.Open(CRecordset::forwardOnly,"SELECT * FROM jnml");
    CString szResult;
    while( !tmpRS.IsEOF() )
    {
     tmpRS.GetFieldValue( "bt",szResult);
     m_List.AddString( szResult );
     tmpRS.MoveNext();
    }
    以上代码能正确运行,但要花很长时间(30秒左右),而且硬盘在这30秒内一直在操作。
    1、这个数据库没有问题,因为我用把这个数据库用Web服务中,用ASP网页来读取,速度很快,硬盘几乎不动;
    2、我把循环语句去掉,只让它显示一条记录,则只需花2、3秒;
    3、我把循环的语句逐个去掉试了一下,结果发现每一条语句的重复运行都要花较长时间。
    难道用CDatabase和CRecordset访问数据库这么慢吗?我想一定是什么地方出了问题,能帮我吗?
    水平: 刚入门

回答:

    point的意见:
    你可以先获取tmpRS的记录数,再利用for实现循环,这样速度应该会有提高,一般来说能用for的时候就尽量不要用while实现循环。
    
    秋的意见:
    数据库是Access吗?如果是Access,那么最好不要用ODBC,那样速度会很慢,因为Access使用的是Jet引擎.对于Access数据库,应该使用DAO,使用类CDaoDatabase,CDaoRecordset.
    即使不是Access,ODBC本身的速度也不是很快,而且访问的速度也跟数据表的数据量和主键、索引有关。如果Web服务中使用的不是ODBC,那么参照的结果是没有意义的。可以通过使用其他走ODBC的应用程序,比较速度。例如offic97下的MSQuery。仅供参考。
    
    张大力的意见:
    我自己终于找到答案了。原因在于我的“控制面板”、“ODBC数据源”中启动了“跟踪”,取消后,速度就很快了,在2.5秒内就完成了500多条记录的查询、显示等操作。

此问题由point等回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio