为什么用ADO效率这么低? 你使用的是完全相同的SQL语句吗?还有,你的显示过程需要有可比性。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的VC程序代码结构都一样。先MoveFist(),再MoveNext()遍历整个表,不同是RecordSet。记录集打开的记录数都一样。我又什么办法可优化吗?难道遍历1500条记录(包括插入ListView中)非得5秒以上? 在VC下寫建議不要使用ADO,直接與用SQLOLEDB API,速度更多。ADO則因包裝了太多的東西,所以速度會較慢。 ADO代码如下: _RecordsetPtr m_pRecordset; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT * FROM MyTable", _variant_((IDispatch*)theApp->Connection,true), adOpenStatic,adLockOptimistic,adCmdText); _variant_t vCode,vName,....,vAmount; if(!m_pRecordset->BOF ) m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { vCode = m_pRecordset->GetCollect("代码"); vName = m_pRecordset->GetCollect("名称"); . . . vAmount = m_pRecordset->GetCollect("总额"); ctrlList.SetItemText(nItem,0,(_bstr_t)vCode); ctrlList.SetItemText(nItem,1,(_bstr_t)vName); . . . ctrlList.SetItemText(nItem,8,(_bstr_t)vAmount); nItem++; m_pRecordset->MoveNext(); } 不要用静态的,用动态只进游标速度会快。动态游标执行完open后就有一条数据就位,静态的会把1500条提取到内存中才从open返回 呵呵,多谢neosu(neo)。我用了adOpenDynamic后,速度提高了一秒。但还是不够呀!还有哪位给点指导,谢先! change your connection string to use "Provider=SQLOLEDB;......."use adForwardOnly, adReadOnly 我对OLEDB不太熟。我是下面这样写的,连接不上。hr = m_pConnection.CreateInstance("ADODB.Connection");if(SUCCEEDED(hr)) hr = m_pConnection->Open("Provider=SQLOLEDB; SERVER=FREESHOOT; DATABASE=实时数据库;UID=sa;PWD=;", "","",adModeUnknown); try_bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';" "Initial Catalog='pubs';Integrated Security='SSPI';");pConnection->Open(strCnn,"","",adConnectUnspecified); 各位大哥,我用了动态游标也用了OLEDB,但还是很慢,我只有不到两千条记录,却要花8秒多,是不是太夸张了?倒是我原先用ODBC(从ClassWizard派生CMarketSet)写,还只要4秒多一点。代码如下; CMarketSet m_MarketSet; if(!m_MarketSet.IsOpen()) { m_MarketSet.Open(); } .... if(!m_MarketSet.IsBOF()) m_MarketSet.MoveFirst(); while(!m_MarketSet.IsEOF()) { ctrlList.SetItemText(nItem,0,m_MarketSet.m_column1); ctrlList.SetItemText(nItem,1,m_MarketSet.m_column2); . . . nItem++; m_MarketSet.MoveNext(); }用以前在坛子里听某位前辈说(不记得啥名了),他用ADO遍历40万条记录也只要10几秒钟呀.还有什么优化的办法呢? 用m_MarketSet.getrows()先把记录取出来就快了 sql server 2005安装出错Login failed for user 'sa' 将存储过程执行结果,导入临时表或表变量 sql 读取问题 批量创建存储过程 一张表的image类型字段更新到另一张表的image类型字段,sql 怎么写? 一个存储过程里面的循环问题请教 XP HOME里 卸载掉SQL2000后,安装SQL7.0问题 字段前的空格去不掉 新开帖求一个条件语句的写法 创建制约关系错误 如何取消SQL服务器分发和定阅服务? 不知道数据库空间为什么会出现付值?急!
先MoveFist(),再MoveNext()遍历整个表,不同是RecordSet。
记录集打开的记录数都一样。我又什么办法可优化吗?
难道遍历1500条记录(包括插入ListView中)非得5秒以上?
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM MyTable",
_variant_((IDispatch*)theApp->Connection,true),
adOpenStatic,adLockOptimistic,adCmdText); _variant_t vCode,vName,....,vAmount; if(!m_pRecordset->BOF )
m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF)
{
vCode = m_pRecordset->GetCollect("代码");
vName = m_pRecordset->GetCollect("名称");
.
.
.
vAmount = m_pRecordset->GetCollect("总额"); ctrlList.SetItemText(nItem,0,(_bstr_t)vCode);
ctrlList.SetItemText(nItem,1,(_bstr_t)vName);
.
.
.
ctrlList.SetItemText(nItem,8,(_bstr_t)vAmount);
nItem++;
m_pRecordset->MoveNext();
}
动态游标执行完open后就有一条数据就位,静态的会把1500条提取到内存中才从open返回
我用了adOpenDynamic后,速度提高了一秒。但还是不够呀!还有哪位给点指导,谢先!
if(SUCCEEDED(hr))
hr = m_pConnection->Open("Provider=SQLOLEDB;
SERVER=FREESHOOT;
DATABASE=实时数据库;UID=sa;PWD=;",
"","",adModeUnknown);
"Initial Catalog='pubs';Integrated Security='SSPI';");pConnection->Open(strCnn,"","",adConnectUnspecified);
却要花8秒多,是不是太夸张了?倒是我原先用ODBC(从ClassWizard派生CMarketSet)写,还只要4秒多一点。
代码如下; CMarketSet m_MarketSet;
if(!m_MarketSet.IsOpen())
{
m_MarketSet.Open();
}
....
if(!m_MarketSet.IsBOF())
m_MarketSet.MoveFirst();
while(!m_MarketSet.IsEOF())
{
ctrlList.SetItemText(nItem,0,m_MarketSet.m_column1);
ctrlList.SetItemText(nItem,1,m_MarketSet.m_column2);
.
.
.
nItem++;
m_MarketSet.MoveNext();
}
用以前在坛子里听某位前辈说(不记得啥名了),他用ADO遍历40万条记录也只要
10几秒钟呀.
还有什么优化的办法呢?