VC+ADO+SQLSERVER,慢? 我用vc通过ado访问一个两千多条数据的表,为什么速度奇慢?比vb+ado慢一倍的时间。晕死了,请问高手怎样才能快点?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码是这样的:定义一个CConnDataBase类连接数据库CConnDataBase::CConnDataBase(){ m_pConnection=NULL;}CConnDataBase::~CConnDataBase(){ m_pRecordset->Close(); m_pConnection->Close(); m_pRecordset.Release(); m_pConnection.Release(); ::CoUninitialize(); }void CConnDataBase::ExecuteSQL(CString sql){ ::CoInitialize(NULL); m_pConnection.CreateInstance(__uuidof(Connection)); m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=;Initial Catalog=tbCommodity;Data Source="; m_pConnection->Open(L"",L"",L"",adCmdUnspecified); m_pRecordset=m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);}点击button按钮,在listcontrol中显示数据void CLcmsDlg::OnButton1() { // TODO: Add your control notification handler code here CConnDataBase db; CString sql="select * from tbMemberInfo"; db.ExecuteSQL(sql); int i=0; m_List.DeleteAllItems(); while(!db.m_pRecordset->rsEOF){ m_List.InsertItem(i,""); m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID")); m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company")); m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address")); i+=1; db.m_pRecordset->MoveNext(); }}数据表中有两千多条八九个字段的数据,为什么比vb中显示还慢??是不是listcontrol控件本身就慢呢??? 应该不会的,估计时你的程序有问题。另外,在程序里面直接执行sql语句更好一些 m_pConnection->CursorLocation = adUseClient; rs.LockType = adLockBatchOptimistic 楼上两位大哥,我刚试过了,不是这个问题啊。我一直怀疑是while语句还是listctrl控件的问题。好像给你们分,可是……嘻嘻 楼主屏蔽listctrl控件的显示,再统计一下时间,看看速度如何 将:while(!db.m_pRecordset->rsEOF){m_List.InsertItem(i,"");m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));i+=1;db.m_pRecordset->MoveNext();}改为:while(!db.m_pRecordset->rsEOF){_bstr_t bstrTemp;bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("Company"));bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("Address"));i+=1;db.m_pRecordset->MoveNext();}AfxMessageBox("完成");这样就是读取所有记录,而不显示出来,如果完成得很快,则说明根本不是数据读取问题。 试试CDBC呢 ----- ADO比ODBC何止一点点...用ODBC为了兼容性好,而不是为了效率,效率还是OLE DB最高,ADO是基于OLE DB的,绝对优于ODBC几皮!!! TianChong说的有道理,测试后确实不是数据读取的问题。可是对于ListCtrl控件好像只能InsertItem并且一项一项SetItemText了? m_List.SetRedaw(FALSE);m_List.DeleteAllItems();while(!db.m_pRecordset->rsEOF){m_List.InsertItem(i,"");m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));i+=1;db.m_pRecordset->MoveNext();}m_List.SetRedaw();另外,不要让m_List排序,要排的话让数据库来做。 去掉list控件的处理,单纯的去读取数据,看看速度怎么样!如果速度不慢,则说明使list控件的问题 2000多条记录一下放到list里,似乎有点问题哦 程序升级的问题 ImageMagick能否将24位图像转成8位的? 求:将VC6.0单字节程序升级到VS2008并支持宽字节的一些注意和配置 做一个mfc的控件类简单程序,要有代码注释及功能说明 vc6.0的能调用vs2005编译生成的dll吗? 如何在SDI的视图上动态创建控件? 论坛改版完成,散分了 关于List Control中多选行同时进行修改的问题,我认为比较麻烦! 如何得到firefox缓存的网页内容? 请教大虾 谁有VC++实效编程百例这本书? 网上都找不到了, 请问如何实现下面的要求:删除表A中某一行,则自动删除表B中,代表A的子项的记录?
定义一个CConnDataBase类连接数据库
CConnDataBase::CConnDataBase()
{
m_pConnection=NULL;
}CConnDataBase::~CConnDataBase()
{
m_pRecordset->Close();
m_pConnection->Close();
m_pRecordset.Release();
m_pConnection.Release();
::CoUninitialize();
}void CConnDataBase::ExecuteSQL(CString sql)
{
::CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=;Initial Catalog=tbCommodity;Data Source=";
m_pConnection->Open(L"",L"",L"",adCmdUnspecified);
m_pRecordset=m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);}点击button按钮,在listcontrol中显示数据
void CLcmsDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CConnDataBase db;
CString sql="select * from tbMemberInfo";
db.ExecuteSQL(sql); int i=0; m_List.DeleteAllItems();
while(!db.m_pRecordset->rsEOF){
m_List.InsertItem(i,"");
m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));
m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));
i+=1;
db.m_pRecordset->MoveNext();
}
}数据表中有两千多条八九个字段的数据,为什么比vb中显示还慢??是不是listcontrol控件本身就慢呢???
while(!db.m_pRecordset->rsEOF){
m_List.InsertItem(i,"");
m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));
m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));
i+=1;
db.m_pRecordset->MoveNext();
}改为:
while(!db.m_pRecordset->rsEOF){
_bstr_t bstrTemp;
bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("Company"));
bstrTemp=(_bstr_t)db.m_pRecordset->GetCollect("Address"));
i+=1;
db.m_pRecordset->MoveNext();
}AfxMessageBox("完成");
这样就是读取所有记录,而不显示出来,如果完成得很快,则说明根本不是数据读取问题。
m_List.DeleteAllItems();while(!db.m_pRecordset->rsEOF){
m_List.InsertItem(i,"");
m_List.SetItemText(i,0,(_bstr_t)db.m_pRecordset->GetCollect("MemberID"));
m_List.SetItemText(i,1,(_bstr_t)db.m_pRecordset->GetCollect("Company"));
m_List.SetItemText(i,2,(_bstr_t)db.m_pRecordset->GetCollect("Address"));
i+=1;
db.m_pRecordset->MoveNext();
}
m_List.SetRedaw();另外,不要让m_List排序,要排的话让数据库来做。