_RecordsetPtr Requery 特别慢

woshi_hujunjun 2017-10-26 03:33:20
使用Requery (-1)时,特别慢,400条数据居然花了将近10秒钟。

生成RecordsetPtr时的设置
if (SUCCEEDED(m_record.CreateInstance(__uuidof(Recordset))))
{
m_record->CursorLocation = adUseClient;
m_pDBList->GetRecordSet(std::get<1>(m_dbConfig),
m_record,
CursorTypeEnum::adOpenForwardOnly);
}

GetRecordSet:
bool CDBList::GetRecordSet(CString bstrSqlCmd,
_RecordsetPtr &RecordSet,
CursorTypeEnum RecordSetType)
{
long l_statu = m_pConnection->GetState();

if (l_statu != adStateOpen)
{
return false;
}
if (bstrSqlCmd.GetLength() < 10)
{
return false;
}

bool isOK = false;
int count = 0;
bool isReconn = false;
clock_t start = clock();
while (!isOK)
{
try
{
//打开记录集
if (FAILED(RecordSet->Open(_bstr_t(bstrSqlCmd),
m_pConnection.GetInterfacePtr(),
RecordSetType, adLockOptimistic, adCmdText)))
{
m_strMsg = _T("查询失败");
return false;
}
isOK = true;
m_strMsg = _T("查询成功");
}
catch (_com_error e)
{

m_strMsg.Format(_T("获取记录集出现异常,异常信息:%s,异常描述:%s"),
e.ErrorMessage(), e.Description().GetBSTR());
//CLog::Write(Error + bstrSqlCmd);

//CVecMsg::AddMsg(tagMsg(Error, eMsgType::MSG_ERROR));

clock_t end = clock();
double times = (double)(end - start) / CLOCKS_PER_SEC;
if (isReconn)
{
m_strMsg = _T("重新连接成功,依然执行失败,放弃执行");
return false;
}

if (++count >= 3 && times > 6)
{
m_strMsg = _T("重新执行操作3次,且时间超过6S,重新连接");

count = 0;
isReconn = ReConn();
start = clock();
}
Sleep(200);

isOK = false;
}
}
return true;
}
...全文
446 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2017-10-26
  • 打赏
  • 举报
回复
引用 4 楼 woshi_hujunjun 的回复:
很奇怪,如果我放在线程中,不等待: m_ShowFuture =std::async([&]{ if (SUCCEEDED(m_record->Requery(-1))) { return true; } return false; }); 速度就正常 如果马上等待, if (m_ShowFuture.valid()) { m_ShowFuture.get(); } 还是很慢
那你就用异步的方式查询。它可能是逐步返回
赵4老师 2017-10-26
  • 打赏
  • 举报
回复
也许本来就不应该如此等待。 百度搜相关关键字。
woshi_hujunjun 2017-10-26
  • 打赏
  • 举报
回复
很奇怪,如果我放在线程中,不等待: m_ShowFuture =std::async([&]{ if (SUCCEEDED(m_record->Requery(-1))) { return true; } return false; }); 速度就正常 如果马上等待, if (m_ShowFuture.valid()) { m_ShowFuture.get(); } 还是很慢
赵4老师 2017-10-26
  • 打赏
  • 举报
回复
引用 2 楼 woshi_hujunjun 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] SQL Server: 将查询语句放在查询分析器中, 查询、显示执行计划、分析之。
在数据库中直接查询,是很快的,也就1秒[/quote] 搜“ADO 查询速度超慢”
woshi_hujunjun 2017-10-26
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
SQL Server: 将查询语句放在查询分析器中, 查询、显示执行计划、分析之。
在数据库中直接查询,是很快的,也就1秒
赵4老师 2017-10-26
  • 打赏
  • 举报
回复
SQL Server: 将查询语句放在查询分析器中, 查询、显示执行计划、分析之。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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