Ado连接数据库,变量每条记录组装成XML效率问题!!

版主大哥 2014-03-06 01:19:07
int ret = res.Open((LPCTSTR)strSql.c_str());

int nnn = 0;

if (ret)
{
long lFileds = res.GetFieldsCount(); //列数
if (lFileds > 0)
{

while (1)
{
if (res.IsEOF())
{
break;
}
TiXmlElement* pRow = m_outXml.AddXmlChildElement(pDataElementOut,"R");
int yy = GetTickCount();

int i = 0;
CString strFieldValue;
for (i = 0;i < lFileds;i++)
{
strFieldValue.Empty();
res.GetCollect(i,strFieldValue);
m_outXml.AddXmlChildElement(pRow,res.GetFieldName(i).GetBuffer(),strFieldValue.GetBuffer());
/* TiXmlElement* pRow = m_outXml.AddXmlChildElement(pDataElementOut,"test");*/
}
int nT = GetTickCount() - yy;
nnn += nT;
res.MoveNext();
}
m_outXml.ReplaceElementAttribute(pDataElementOut,"Flag","1");
m_outXml.ReplaceElementValue(pErrMsgElementOut,"");
nRet = 0;
res.Close();
}


代码如上,当记录10000条以上(有18列)这个过程需要4-5秒

观察到只是在一下的for循环消耗了时间
for (i = 0;i < lFileds;i++)
{
strFieldValue.Empty();
res.GetCollect(i,strFieldValue);
m_outXml.AddXmlChildElement(pRow,res.GetFieldName(i).GetBuffer(),strFieldValue.GetBuffer());
/* TiXmlElement* pRow = m_outXml.AddXmlChildElement(pDataElementOut,"test");*/
}


请问有什么可以优化的
...全文
220 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
版主大哥 2014-03-11
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
[quote=引用 14 楼 xihu1364 的回复:] [quote=引用 13 楼 worldy 的回复:] 保存为xml比保存为2进制数据节省数据起码要增加一倍 这个说错了 保存为xml比保存为2进制,数据量起码要增加一倍
人家c#数据库访问10多W数据组装成xml只需要0.2秒,情何以堪... 而c++需要2秒多...应该是ado慢了[/quote] 不太可能吧,[/quote] 呵呵 亲眼见证
版主大哥 2014-03-10
  • 打赏
  • 举报
回复
引用 13 楼 worldy 的回复:
保存为xml比保存为2进制数据节省数据起码要增加一倍 这个说错了 保存为xml比保存为2进制,数据量起码要增加一倍
人家c#数据库访问10多W数据组装成xml只需要0.2秒,情何以堪... 而c++需要2秒多...应该是ado慢了
worldy 2014-03-10
  • 打赏
  • 举报
回复
引用 14 楼 xihu1364 的回复:
[quote=引用 13 楼 worldy 的回复:] 保存为xml比保存为2进制数据节省数据起码要增加一倍 这个说错了 保存为xml比保存为2进制,数据量起码要增加一倍
人家c#数据库访问10多W数据组装成xml只需要0.2秒,情何以堪... 而c++需要2秒多...应该是ado慢了[/quote] 不太可能吧,
worldy 2014-03-08
  • 打赏
  • 举报
回复
保存为xml比保存为2进制数据节省数据起码要增加一倍 这个说错了 保存为xml比保存为2进制,数据量起码要增加一倍
worldy 2014-03-08
  • 打赏
  • 举报
回复
引用 10 楼 xihu1364 的回复:
[quote=引用 9 楼 worldy 的回复:] lz将记录集使用 rs.save( 文件名,xml格式) 不就得了,干嘛自己存啊? 另外这个代码写的好特别 while (1) { if (res.IsEOF()) { break; } ..... } 干嘛不写成: while(!rse.IsEof) { ..... }
需要将该数据组装发出去啊,难道存在文件里,再去读? 还有刚才测试存在文件中,里面的数据跟我在sql客户端查的不一样啊,难道还要转?[/quote] 可以save到流对象,到客户端使用open打开流就可以 xml是灵活的,rs有自己xml标签 10w数据你即使什么都不做传递到客户也是快不了,你可以自己算一下数据量是多少,再,保存为xml比保存为2进制数据节省数据起码要增加一倍
worldy 2014-03-07
  • 打赏
  • 举报
回复
lz将记录集使用 rs.save( 文件名,xml格式) 不就得了,干嘛自己存啊? 另外这个代码写的好特别 while (1) { if (res.IsEOF()) { break; } ..... } 干嘛不写成: while(!rse.IsEof) { ..... }
版主大哥 2014-03-07
  • 打赏
  • 举报
回复
用sql for xml PATH可以将所有记录变成一个记录 但是不知道怎么获取 用常规获取的是BLOB...
版主大哥 2014-03-07
  • 打赏
  • 举报
回复
引用 6 楼 zyq5945 的回复:
记得ADO是有个接口是获取一行记录以数组的形式返回的,你找找试试看。
就是Fields? 然后Fields[i]->GetName()/GetValue()?
zyq5945 2014-03-07
  • 打赏
  • 举报
回复
记得ADO是有个接口是获取一行记录以数组的形式返回的,你找找试试看。
版主大哥 2014-03-07
  • 打赏
  • 举报
回复
烦死了....查询10w数据,到客户端需要20秒,崩溃啊.... 求方案...
版主大哥 2014-03-07
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
lz将记录集使用 rs.save( 文件名,xml格式) 不就得了,干嘛自己存啊? 另外这个代码写的好特别 while (1) { if (res.IsEOF()) { break; } ..... } 干嘛不写成: while(!rse.IsEof) { ..... }
需要将该数据组装发出去啊,难道存在文件里,再去读? 还有刚才测试存在文件中,里面的数据跟我在sql客户端查的不一样啊,难道还要转?
版主大哥 2014-03-06
  • 打赏
  • 举报
回复
引用 4 楼 zyq5945 的回复:
那就是AddXmlChildElement的速度问题了。
注释掉 res.GetCollect(i,strFieldValue); m_outXml.AddXmlChildElement(pRow,res.GetFieldName(i).GetBuffer(),strFieldValue.GetBuffer()); 换成 m_outXml.AddXmlChildElement(pRow,"test","test"); 速度就1s内了
zyq5945 2014-03-06
  • 打赏
  • 举报
回复
那就是AddXmlChildElement的速度问题了。
版主大哥 2014-03-06
  • 打赏
  • 举报
回复
引用 2 楼 zyq5945 的回复:
res.GetFieldName(i)可以提到大循环外面来,保存成一个数组,GetBuffer()不需要调用,CString可以自己转换成LPCTSTR。
换了,速度还是一样...
zyq5945 2014-03-06
  • 打赏
  • 举报
回复
res.GetFieldName(i)可以提到大循环外面来,保存成一个数组,GetBuffer()不需要调用,CString可以自己转换成LPCTSTR。
版主大哥 2014-03-06
  • 打赏
  • 举报
回复

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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