如何一次保存结果集?

louifox 2007-07-06 01:29:55
用ado连接sqlserver,执行select语句,返回一个结果集,现在要把这个结果集写入磁盘文件,如果按记录一条一条的写,效率很低,有什么办法可以把整个结果集一次性写入磁盘文件?
我程序需要非常频繁的把结果集写入文件,ado是否有提供一次性操作结果集的方法呢?
...全文
273 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
尘雨 2007-07-09
  • 打赏
  • 举报
回复
//保存结果集到文件
_RecordsetPtr pRs = NULL ;
_bstr_t sql("select * from a");

pRs.CreateInstance(__uuidof(Recordset));

pRs->CursorLocation=adUseClient;
pRs->Open(_bstr_t(sql),
_variant_t((IDispatch *)pConn,true),
adOpenStatic,
adLockReadOnly,
adCmdText);

pRs->Save("c:\\aaa.dat",adPersistADTG);
pRs->Close();

//从文件中读取到结果集
pRs->Open(_bstr_t("c:\\aaa.dat"),
_variant_t((IDispatch *)pConn,true),
adOpenStatic,
adLockReadOnly,
adCmdFile);
TRACE("RsState:%d\n",pRs->State);
TRACE("RecordCount:%d\n",pRs->RecordCount);
TRACE("RecordCount:%s\n",(LPCTSTR)(_bstr_t)pRs->Fields->Item["Exp1"]->Value);
if (pRs)
if (pRs->State == adStateOpen)
pRs->Close();

if (pConn)
if (pConn->State == adStateOpen)
pConn->Close();
尘雨 2007-07-09
  • 打赏
  • 举报
回复
adPersistADTG改成adPersistXML
按照XML方式,不过建议你看一下以下说明和实例XML文件

这是一个测试表

商品名称 数量 进出货 时间

袜子 100 1 2007-05-01
袜子 50 1 2007-06-01
袜子 50 -1 2007-06-03
靴子 120 1 2007-05-02
靴子 50 -1 2007-05-03

生成的XML文件

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
<s:AttributeType name='c0' rs:name='商品名称' rs:number='1' rs:nullable='true' rs:writeunknown='true'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='100'/>
</s:AttributeType>
<s:AttributeType name='c1' rs:name='数量' rs:number='2' rs:nullable='true' rs:writeunknown='true'>
<s:datatype dt:type='i2' dt:maxLength='2' rs:precision='5' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='c2' rs:name='进出货' rs:number='3' rs:nullable='true' rs:writeunknown='true'>
<s:datatype dt:type='i2' dt:maxLength='2' rs:precision='5' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='c3' rs:name='时间' rs:number='4' rs:nullable='true' rs:writeunknown='true'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='20'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row c0='袜子' c1='100' c2='1' c3='2007-05-01'/>
<z:row c0='袜子' c1='50' c2='1' c3='2007-06-01'/>
<z:row c0='袜子' c1='50' c2='-1' c3='2007-06-03'/>
<z:row c0='靴子' c1='120' c2='1' c3='2007-05-02'/>
<z:row c0='靴子' c1='50' c2='-1' c3='2007-05-03'/>
</rs:data>
</xml>

以下是官方说明
以 XML 格式持久保留记录
像 ADTG 格式一样,以 XML 格式进行的 Recordset 持久保留是通过 Microsoft OLE DB 持久保留提供者实现的。该提供者将从保存的 XML 文件或流式数据(其中包含由 ADO 生成的架构信息)生成仅向前、只读的行集。同样,它可以取得 ADO Recordset、生成 XML 并将它保存到文件或任何实现 COM IStream 接口的对象中(实际上,文件只是支持 IStream 的对象的另一个范例)。对于 2.5 版和更高版本,ADO 依靠 Microsoft XML 语法分析程序(MSXML)将 XML 加载到 Recordset 中;因此,msxml.dll 是必需的。对于 2.5 版本,MSXML 与 Internet Explorer 5 一同交付。对于 2.6 版,MSXML 与 SQL Server 2000 一同交付。
louifox 2007-07-09
  • 打赏
  • 举报
回复
结果集中的数据是如何组织的?比如说我要对这个结果集文件中的数据进行本地编辑,而且不能用ado的方式打开。
CathySun118 2007-07-08
  • 打赏
  • 举报
回复
学习了
CathySun118 2007-07-08
  • 打赏
  • 举报
回复
学习
zaodt 2007-07-06
  • 打赏
  • 举报
回复
学习。
i_love_pc 2007-07-06
  • 打赏
  • 举报
回复
Save 方法 (ADO Recordset)


将 Recordset 保存(持久)在文件中。

语法

recordset.Save FileName, PersistFormat

参数

FileName 可选。保存 Recordset 的文件的完整路径名。

PersistFormat 可选。保存 Recordset 所用的格式。当前默认并唯一有效的值为 adPersistADTG。

说明

只能对打开的 Recordset 调用 Save 方法。随后使用 Open 方法可通过 FileName 恢复 Recordset。

如果 Filter 属性影响 Recordset,则只保存经过筛选的行。如果 Recordset 具有分级结构,那么将保存当前子 Recordset 和它的子 Recordset,但不是父 Recordset。

在第一次保存 Recordset 时指定 FileName。如果随后调用 Save,应忽略 FileName,否则将产生运行时错误。如果随后用新的 FileName 调用 Save,那么 Recordset 将保存到新文件中,不过新文件和原始文件都是打开的。

Save 不关闭 Recordset 或 FileName,从而可以继续使用 Recordset 并保存最新的更改。在 Recordset 关闭之前 FileName 将保持打开,在这段时间其他应用程序可以读取但不能写入 FileName。

出于安全的原因,不能从 Microsoft Internet Explorer 执行的脚本中使用 Save 方法。

如果当异步 Recordset 获取、执行或更新操作正在进行的同时调用 Save 方法,则 Save 将等待,直到异步操作完成。

在 Save 方法完成后,当前行位置将成为 Recordset 的首行。
nkeverstar 2007-07-06
  • 打赏
  • 举报
回复
m_pRecord->AddNew();
........

m_pRecord->UpdateBatch();
taianmonkey 2007-07-06
  • 打赏
  • 举报
回复
写一个触发器,就是调用过程

4,018

社区成员

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

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