情况:VC6.0+Access2000(8万条记录,7个字段全为文本);
      用CListCtrl控件显示数据;环境:环境1:CeleronD 2.4G,256M,Windows2000;
      环境2:Celeron3 1.1G,256M,Windows98se;------------------------------------------------------------------------------------
//ODBC代码:(m_list为CListCtrl控件,mySet为CRecordset类派生) CString strSQL="select * from Table1";
if(!mySet.IsOpen()) mySet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);//如果没有这条语句和后面SetRedraw(TRUE)语句,速度慢一倍 int i=0;
while (!mySet.IsEOF())
{
m_list.InsertItem(i,mySet.m_Field1);
m_list.SetItemText(i,1,mySet.m_Field2);
m_list.SetItemText(i,2,mySet.m_Field3);
m_list.SetItemText(i,3,mySet.m_Field4);
m_list.SetItemText(i,4,mySet.m_Field5);
m_list.SetItemText(i,5,mySet.m_Field6);
m_list.SetItemText(i,6,mySet.m_Field7);
mySet.MoveNext(); i++;//如果没有这条语句,速度慢N倍
}
m_list.SetRedraw(TRUE);
     
结果:在环境1中耗时18秒;在环境2中耗时64秒
-----------------------------------------------------------------------------------------
//DAO代码:(m_list为CListCtrl控件,MySet为CDaoRecordset类派生) if(!pMySet.IsOpen())
pMySet.Open(); int i=0;
m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);//如果没有这条语句和后面SetRedraw(TRUE)语句,速度慢一倍 while(!pMySet.IsEOF())
{
m_list.InsertItem(i,pMySet.m_Field1);
m_list.SetItemText(i,1,pMySet.m_Field2);
m_list.SetItemText(i,2,pMySet.m_Field3);
m_list.SetItemText(i,3,pMySet.m_Field4);
m_list.SetItemText(i,4,pMySet.m_Field5);
m_list.SetItemText(i,5,pMySet.m_Field6);
m_list.SetItemText(i,6,pMySet.m_Field7);
pMySet.MoveNext();
i++;//如果没有这条语句,速度慢N倍
}
m_list.SetRedraw(TRUE);结果:在环境1中耗时7秒;在环境2中耗时13秒
---------------------------------------------------------------------------------------------
//ADO代码(不使用Binding技术)(m_list为CListCtrl控件,mySet为_RecordsetPtr) _bstr_t sql("select * from Table1");
CString str;
_variant_t Holder; m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);//如果没有这条语句和后面SetRedraw(TRUE)语句,速度慢一倍 int i=0;
try
{
mySet.CreateInstance(__uuidof(Recordset));
mySet=myConn->Execute(sql,NULL,adCmdText);
while (!mySet->adoEOF)
{
Holder=mySet->GetCollect(_T("Field1"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.InsertItem(i,str); Holder=mySet->GetCollect(_T("Field2"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.SetItemText(i,1,str); Holder=mySet->GetCollect(_T("Field3"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.SetItemText(i,2,str); Holder=mySet->GetCollect(_T("Field4"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.SetItemText(i,3,str); Holder=mySet->GetCollect(_T("Field5"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.SetItemText(i,4,str); Holder=mySet->GetCollect(_T("Field6"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.SetItemText(i,5,str); Holder=mySet->GetCollect(_T("Field7"));
str=Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
m_list.SetItemText(i,6,str);
mySet->MoveNext();
i++;//如果没有这条语句,速度慢N倍
}

}
catch(_com_error& e)
{
CString show;
show.Format("My error %s",e.ErrorMessage());
AfxMessageBox(show);
return;
}
m_list.SetRedraw(TRUE);结果:在环境1中耗时12秒;在环境2中耗时27秒
------------------------------------------------------------------------------------------
//ADO代码(使用Binding技术)(m_list为CListCtrl控件,mySet为_RecordsetPtr) IADORecordBinding * picRs=NULL;
CTestRs rs;//为CADORecordBinding类派生
m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);//如果没有这条语句和后面SetRedraw(TRUE)语句,速度慢一倍 try
{
_bstr_t strSQL("select * from Table1");
TESTHR(mySet.CreateInstance(__uuidof(Recordset)));
mySet=myConn->Execute(strSQL,NULL,adCmdText);
TESTHR(mySet.QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&rs));
int i=0;
while (!mySet->adoEOF)
{
m_list.InsertItem(i,rs.m_sz_field1);
m_list.SetItemText(i,1,rs.m_sz_field2);
m_list.SetItemText(i,2,rs.m_sz_field3);
m_list.SetItemText(i,3,rs.m_sz_field4);
m_list.SetItemText(i,4,rs.m_sz_field5);
m_list.SetItemText(i,5,rs.m_sz_field6);
m_list.SetItemText(i,6,rs.m_sz_field7);
mySet->MoveNext();
i++;//如果没有这条语句,速度慢N倍
}
picRs->Release();
mySet->Close();
}
catch (_com_error& e)
{
AfxMessageBox(e.ErrorMessage());
return;
}
m_list.SetRedraw(TRUE);结果:在环境1中耗时6秒;在环境2中耗时15秒
------------------------------------------------------------------------------------------

解决方案 »

  1.   

    微软的数据访问技术有哪些?
    大体有以下几类:
    一、UDA(UniversalDataAccess)
    这是微软提供的通用数据访问策略。包括ADO、OLEDB和ODBC。它不光提供了数据库的访问能力,对于其它的数据存储技术也同样支持,如目录服务、Excel的表格数据和Exchange服务器数据等。二、ODBC(OpenDatabaseConnectivity)
    这是目前公认的最好的数据访问技术。ODBC结构包含了一个普通的基于SQL的API,它利用对应的驱动程序来开发特定的数据库程序。该技术市场巨大,并且对现在的任何数据库都支持,所以,ODBC仍会在长时期内使用。(注:不敢苟同)三、RDO(RemoteDataObjects)
    它为ODBC提供了一个COM的封装。其目的是简化ODBC的开发和在VisualBasic和VBA程序中发展ODBC。四、Jet
    Jet是安装在MS Access中的数据库引擎。Jet支持MS Access本身的MDB数据库和ODBC。五、DAO(DataAccessObjects)
    它是另一个基于COM的数据访问API。DAO提供了对Jet和ODBC的封装。六、ODBCDirect
    ODBCDirect微软后来为DAO添加的对ODBC的直接访问。强于通过Jet对ODBC进行支持。七、OLEDB
    这是一种普通和简化的基于COM的数据访问规则和API。OLEDB被设计成为独立于特殊的数据库后端和底层结构,并且它是微软最新的数据连接方案。OLE DB Providers可以通过OLEDB与任何数据存储建立链接。八、ADO(ActiveXDataObjects)
    ADO为开发者提供了一个更加友好的对OLEDB的封装。(还是这个最好)九、RDS(RemoteDataServices)
    这是一个为建立多用户系统而基于ADO对ADO数据源进行远程访问的技术。RDS过去是ADC(AdvancedDataConnector)。十、MDAC(MicrosoftDataAccessComponents)
    MDAC是经过验证的分布式UDA的实现和文件。包括四种不同的技术:ODBC、OLEDB、ADO和RDS
      

  2.   

    嗯,这种比较还是可以借鉴的,一般用ADO,觉得还不错
      

  3.   

    想快,假如访问SQL server用DB lib库,它是SQL Server自带的。相对底层的。
      

  4.   

    在VC + SQL Server 2000, 哪个速度最快啊,ADO?