我用vc通过ado访问一个两千多条数据的表,为什么速度奇慢?比vb+ado慢一倍的时间。晕死了,请问高手怎样才能快点??

解决方案 »

  1.   

    代码是这样的:
    定义一个CConnDataBase类连接数据库
    CConnDataBase::CConnDataBase()
    {
    m_pConnection=NULL;
    }CConnDataBase::~CConnDataBase()
    {
    m_pRecordset->Close();
    m_pConnection->Close();
    m_pRecordset.Release();
    m_pConnection.Release();
    ::CoUninitialize();
    }void CConnDataBase::ExecuteSQL(CString sql)
    {
    ::CoInitialize(NULL);
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=;Initial Catalog=tbCommodity;Data Source=";
    m_pConnection->Open(L"",L"",L"",adCmdUnspecified);
        m_pRecordset=m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);}点击button按钮,在listcontrol中显示数据
    void CLcmsDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CConnDataBase db;
    CString sql="select * from tbMemberInfo";
    db.ExecuteSQL(sql); int i=0; m_List.DeleteAllItems();

    while(!db.m_pRecordset->rsEOF){
    m_List.InsertItem(i,"");
    m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
    m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));
    m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));
    i+=1;
    db.m_pRecordset->MoveNext();
    }
    }数据表中有两千多条八九个字段的数据,为什么比vb中显示还慢??是不是listcontrol控件本身就慢呢???
      

  2.   

    应该不会的,估计时你的程序有问题。另外,在程序里面直接执行sql语句更好一些
      

  3.   

    m_pConnection->CursorLocation = adUseClient;
      

  4.   

    rs.LockType = adLockBatchOptimistic
      

  5.   

    楼上两位大哥,我刚试过了,不是这个问题啊。我一直怀疑是while语句还是listctrl控件的问题。好像给你们分,可是……嘻嘻
      

  6.   

    楼主屏蔽listctrl控件的显示,再统计一下时间,看看速度如何
      

  7.   

    将:
    while(!db.m_pRecordset->rsEOF){
    m_List.InsertItem(i,"");
    m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
    m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));
    m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));
    i+=1;
    db.m_pRecordset->MoveNext();
    }改为:
    while(!db.m_pRecordset->rsEOF){
    _bstr_t bstrTemp;
    bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
    bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("Company"));
    bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("Address"));
    i+=1;
    db.m_pRecordset->MoveNext();
    }AfxMessageBox("完成");
    这样就是读取所有记录,而不显示出来,如果完成得很快,则说明根本不是数据读取问题。
      

  8.   

    试试CDBC呢 ----- ADO比ODBC何止一点点...用ODBC为了兼容性好,而不是为了效率,效率还是OLE DB最高,ADO是基于OLE DB的,绝对优于ODBC几皮!!!
      

  9.   

    TianChong说的有道理,测试后确实不是数据读取的问题。可是对于ListCtrl控件好像只能InsertItem并且一项一项SetItemText了?
      

  10.   

    m_List.SetRedaw(FALSE);
    m_List.DeleteAllItems();while(!db.m_pRecordset->rsEOF){
    m_List.InsertItem(i,"");
    m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
    m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));
    m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));
    i+=1;
    db.m_pRecordset->MoveNext();
    }
    m_List.SetRedaw();另外,不要让m_List排序,要排的话让数据库来做。
      

  11.   

    去掉list控件的处理,单纯的去读取数据,看看速度怎么样!如果速度不慢,则说明使list控件的问题
      

  12.   

    2000多条记录一下放到list里,似乎有点问题哦