为什么用ADO效率这么低?

freeshoot 2002-08-30 04:39:15
先申明一下本人乃SQL新手,所以有个问题向大家请教:

我用VC写了一个程序用来显示某个数据库(大约1500条记录),我先用ODBC MFC来
做,将所有记录读出显示需要5秒钟,后听坛子里的人都说ADO效率更高,于是我就该成
为ADO对象方式(_ConnectionPtr,_RecordsetPtr)访问。但结果却要8秒钟,请问各位
这正常吗?我用什么方法效率最好呢?
在线等待,马上给分。


...全文
145 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2002-08-31
  • 打赏
  • 举报
回复
try

_bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
"Initial Catalog='pubs';Integrated Security='SSPI';");

pConnection->Open(strCnn,"","",adConnectUnspecified);

microcat 2002-08-31
  • 打赏
  • 举报
回复
用m_MarketSet.getrows()先把记录取出来就快了
freeshoot 2002-08-31
  • 打赏
  • 举报
回复
各位大哥,我用了动态游标也用了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几秒钟呀.
还有什么优化的办法呢?

freeshoot 2002-08-30
  • 打赏
  • 举报
回复
我对OLEDB不太熟。我是下面这样写的,连接不上。

hr = m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
hr = m_pConnection->Open("Provider=SQLOLEDB;
SERVER=FREESHOOT;
DATABASE=实时数据库;UID=sa;PWD=;",
"","",adModeUnknown);
saucer 2002-08-30
  • 打赏
  • 举报
回复
change your connection string to use "Provider=SQLOLEDB;......."

use adForwardOnly, adReadOnly
freeshoot 2002-08-30
  • 打赏
  • 举报
回复
呵呵,多谢neosu(neo)。
我用了adOpenDynamic后,速度提高了一秒。

但还是不够呀!还有哪位给点指导,谢先!

neosu 2002-08-30
  • 打赏
  • 举报
回复
不要用静态的,用动态只进游标速度会快。


动态游标执行完open后就有一条数据就位,静态的会把1500条提取到内存中才从open返回
freeshoot 2002-08-30
  • 打赏
  • 举报
回复
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();
}
N_chow 2002-08-30
  • 打赏
  • 举报
回复
在VC下寫建議不要使用ADO,直接與用SQLOLEDB API,速度更多。ADO則因包裝了太多的東西,所以速度會較慢。
freeshoot 2002-08-30
  • 打赏
  • 举报
回复
我的VC程序代码结构都一样。
先MoveFist(),再MoveNext()遍历整个表,不同是RecordSet。
记录集打开的记录数都一样。

我又什么办法可优化吗?
难道遍历1500条记录(包括插入ListView中)非得5秒以上?

spring_ok 2002-08-30
  • 打赏
  • 举报
回复
你使用的是完全相同的SQL语句吗?

还有,你的显示过程需要有可比性。
Yang_ 2002-08-30
  • 打赏
  • 举报
回复
正常!
单次测试不能说明任何问题!
全表显示也不说明问题!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧