请教各位,你们是这样写ADO程序的吗?感觉速度好慢呢,600多条记录要1,2分钟才能读出来

iuhxq 2004-12-28 04:02:12
小弟不是专业搞这个的,各位么见笑,也许应该放到一个线程里来做这个,可是俺不太会写线程。呵呵
说说你们是怎么开发数据库程序的。谢谢
void CLogin::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
if ( phone.Left(2) != "13" || phone.GetLength() != 11 )
{
MessageBox("手机号码错误");
return;
}
CString sql;

sql.Format("select * from chat_user where phone=%s",phone);

_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(_variant_t(sql),(IDispatch *)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);

if ( m_pRecordset->adoEOF )
{
MessageBox("手机号码不存在");
return;
}
_variant_t nickname = m_pRecordset->GetCollect("nickname");
title.Format("%s",(char *)(_bstr_t)nickname);
m_pRecordset->Close();

GetDlgItem( IDOK )->EnableWindow(false);
sql.Format("select userid,nickname,phone from chat_user where state=1");
m_pRecordset->Open(_variant_t(sql),(IDispatch *)m_pConnection,adOpenKeyset,adLockOptimistic,adCmdText);
int i=0;
int count = m_pRecordset->RecordCount;
progress.SetRange( 1, count );
CString str;
MSG msg;
User u;
while(!m_pRecordset->adoEOF)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
i++;
str.Format("%d/%d",i,count);
GetDlgItem( IDC_PROTEXT )->SetWindowText(str);
progress.SetPos(i);
_variant_t userid = m_pRecordset->GetCollect("userid");
_variant_t nickname = m_pRecordset->GetCollect("nickname");
_variant_t pho = m_pRecordset->GetCollect("phone");
u.nickname = (char *)(_bstr_t)nickname;
u.userid = userid.lVal;
luser.push_back(u);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();

sql.Format("select * from chat_room");
m_pRecordset->Open(_variant_t(sql),(IDispatch *)m_pConnection,adOpenKeyset,adLockOptimistic,adCmdText);
i=0;
count = m_pRecordset->RecordCount;
progress.SetRange( 1, count );
Room r;
while(!m_pRecordset->adoEOF)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

i++;
str.Format("%d/%d",i,count);
GetDlgItem( IDC_PROTEXT )->SetWindowText(str);
progress.SetPos(i);
_variant_t id = m_pRecordset->GetCollect("id");
_variant_t roomname = m_pRecordset->GetCollect("roomname");
r.id = id.lVal;
r.roomname = (char *)(_bstr_t)roomname;
lroom.push_back(r);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();

OnOK();
}
...全文
223 点赞 收藏 17
写回复
17 条回复
iuhxq 2004年12月29日
数据库很大,所以我把建数据库的脚本发给你了。在chat.rar里
回复 点赞
bohut 2004年12月29日
你的数据库是sql server的吧,请把数据库导成文件发给我。
回复 点赞
iuhxq 2004年12月29日
谢谢楼上各位热心网友

to 伯虎:
我把代码发给你了,麻烦你帮我看一下。
回复 点赞
oyljerry 2004年12月29日
刷新也要消耗时间
回复 点赞
oyljerry 2004年12月29日
不要按一下按钮,就连接一次数据库,这个会消耗时间的
回复 点赞
bohut 2004年12月29日
如果可能的话,请将代码发至bohut@163.com
注明原帖的url。希望可以帮到你。
回复 点赞
zhangqu_980371 2004年12月29日
不是ADO慢。是屏幕刷新慢。
从你的程序看来,屏幕需要输出1200次,也就是刷新1200次。
嘿嘿。当然很慢。在这之前你把屏幕刷新disable掉。保正很快。
回复 点赞
stavck 2004年12月29日
不应该每次按下按钮都要连接数据库的,连接数据库是很慢的,应该把数据库连接做一个成员变量,初始化时连接数据库。
回复 点赞
iuhxq 2004年12月29日
伯虎大哥帮我找到原因了,是网速慢,我晕!

SQL 服务器在远端
回复 点赞
zhangqu_980371 2004年12月29日
如果一定排除显示问题,那么就是数据库问题:索引
回复 点赞
lemon_wei 2004年12月29日
我用ADO从ACEESS数据库查询新数据写到SQL server 数据库,每分钟240条数据 还是分布在15个表中,只用6秒多一点。我想说的是ADO没有这么慢,应该是其它地方有问题,上面有人也说了,显示也是要花一定的时间的。
  
回复 点赞
sharkhuang 2004年12月28日
ADO不会这么慢!可能数据库哪里出问题了!还是设置问题!
回复 点赞
iuhxq 2004年12月28日
哪位大虾能帮忙看看,哪里有问题吗?
回复 点赞
我的女神 2004年12月28日
如上,或许是你的代码有问题。
回复 点赞
bohut 2004年12月28日
应该是数据库或者你的代码处理的问题,ado的速度还不至于慢成这样。
回复 点赞
iuhxq 2004年12月28日
什么接口?不好意思,偶只会用ADO操作数据库
回复 点赞
MZP 2004年12月28日
ADO速度就是这样了,很慢。
要想快用专用接口。
回复 点赞
发动态
发帖子
数据库
创建于2007-09-28

3444

社区成员

3.9w+

社区内容

VC/MFC 数据库
社区公告
暂无公告