社区
MS-SQL Server
帖子详情
为什么用ADO效率这么低?
freeshoot
2002-08-30 04:39:15
先申明一下本人乃SQL新手,所以有个问题向大家请教:
我用VC写了一个程序用来显示某个数据库(大约1500条记录),我先用ODBC MFC来
做,将所有记录读出显示需要5秒钟,后听坛子里的人都说ADO效率更高,于是我就该成
为ADO对象方式(_ConnectionPtr,_RecordsetPtr)访问。但结果却要8秒钟,请问各位
这正常吗?我用什么方法效率最好呢?
在线等待,马上给分。
...全文
145
12
打赏
收藏
为什么用ADO效率这么低?
先申明一下本人乃SQL新手,所以有个问题向大家请教: 我用VC写了一个程序用来显示某个数据库(大约1500条记录),我先用ODBC MFC来 做,将所有记录读出显示需要5秒钟,后听坛子里的人都说ADO效率更高,于是我就该成 为ADO对象方式(_ConnectionPtr,_RecordsetPtr)访问。但结果却要8秒钟,请问各位 这正常吗?我用什么方法效率最好呢? 在线等待,马上给分。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
正常!
单次测试不能说明任何问题!
全表显示也不说明问题!
优化
ADO
的执行
效率
可帮助你解决
ADO
执行
效率
优化的问题,提高
ADO
的使用
效率
。
小而强悍的C++
ADO
封装类
最近找到一个不错的
ado
封装类,很小但功能很强,而且可以自己动手继续完善,适合在一些小的项目中使用,哈哈
delphi DBX,
ADO
,FD
效率
测试.rar
delphi DBX,
ADO
,FD
效率
测试,DBX的
效率
是真高。
ado
类
ado
类
收集的一个
ADO
类,编写的很完美,对于数据库的操作很方便,做这...对于数据库的查询、删除、插入、更新……涉及到的操作全在里面,看到别人写的这么棒,学习学习,以后也能写出这样的类,帮助广大程序员提高开发
效率
。
ADO
.NET本质论
讲解了数据结构,演示了如何用
ADO
.NET来解决具体的数据访问问题。重点讨论了
ADO
.NET如何有效地平衡"功能的泛化"和"执行
效率
",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问API(包括OLE DB,
ADO
...
MS-SQL Server
34,590
社区成员
254,589
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章