如何复制_RecordsetPtr对象?请大家帮我!

ByronLiu 2003-11-12 08:11:42
我用ADO,我想复制一个_RecordsetPtr对象. 不知道该怎么做.
我听说,Clone可以,但是,复制的_RecordsetPtr指向的一同一块内存,原来的_RecordsetPtr内的数据变量,复制的也会变化.

我想要的是,"复制的_RecordsetPtr是指向另一块内存的"! 谁知道,请帮帮我!
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxuliang 2010-06-20
  • 打赏
  • 举报
回复
BOOL CADO::Select(CString strSelect,LPDISPATCH *ppRecordset)
{
BOOL bReturn=false;

try
{
if (!_connPtr)
{
ConnetDB();
}
if(_connPtr)
{
_variant_t varAff;
_RecordsetPtr pRs;
pRs.CreateInstance(__uuidof(Recordset));
pRs->CursorType = adOpenStatic;
pRs->LockType = adLockReadOnly;

TESTHR(pRs->Open((_bstr_t)strSelect,_connPtr.GetInterfacePtr(), adOpenStatic,adLockReadOnly,adCmdText));



pRs->Clone(adLockUnspecified)->QueryInterface(IID_IDispatch,(void**)ppRecordset);
pRs->Close();
pRs=NULL;

bReturn=true;
status=NORMAL;
}


}
catch (_com_error &e) {

CloseConnection();
_connPtr=NULL;
logRecord.WriteLog(DB_LOG,hostName+" "+strSelect,NULL);
status=SELECT_EXECPTION;

}
return bReturn;

}
Earthdog 2003-11-13
  • 打赏
  • 举报
回复
下面的代码可以告诉你如何使用_StreamPtr对象:
其中
spRecordset是_RecordsetPtr对象
spConnection是_ConnectionPtr对象
spStream是_StreamPtr对象

存入_StreamPtr对象:

spRecordset->PutCursorLocation(adUseClientBatch);
spRecordset->Open(bstrSQL, spConnection.GetInterfacePtr(), adOpenStatic, adLockBatchOptimistic, -1);

// 设置_Recordset为无连接的_Recordset
VARIANT var;
::VariantInit(&var);
V_VT(&var) = VT_DISPATCH;
V_DISPATCH(&var) = NULL;
spRecordset->PutActiveConnection(var);
::VariantClear(&var);

// 创建保存_Recordset内容的流
hr = spStream.CreateInstance(__uuidof(Stream));
if (FAILED(hr))
{
// 创建失败
return;
}

// 将_Recordset内容存入流
hr = spRecordset->Save(spStream.GetInterfacePtr(), adPersistXML);



从_StreamPtr对象中读取:

// 从流中读取记录集内容
spRecordset->PutCursorLocation(adUseClientBatch);
spRecordset->Open(spStream.GetInterfacePtr(), vtMissing, adOpenStatic, adLockBatchOptimistic, -1);

// 设置_Recordset的状态为无连接
VARIANT var;
::VariantInit(&var);
V_VT(&var) = VT_DISPATCH;
V_DISPATCH(&var) = NULL;
spRecordset->PutActiveConnection(var);
::VariantClear(&var);

Earthdog 2003-11-13
  • 打赏
  • 举报
回复
PutCursorLocation()是设置_Recordset的游标服务的类型(MSDN: Indicates the location of the cursor service.)
有下面的一些参数
adUseNone 不使用(已经废除了,不应该再使用它)
adUseServer 使用服务器端的,限制比较多
adUseClient 使用客户端的,没有限制(上面的adUseClientBatch应该是这个的,当要使用无连接的_Recordset的时候就需要设置这种类型才行,关于无连接的_Recordset就是将_Recordset的ActiveConnection设置成空的_Recordset)

其实上面的_StreamPtr、_RecordsetPtr都是智能指针,是用来对COM接口的一个包装,使用户不必为COM接口的创建以及释放等操过多的心
GetInterfacePtr()的作用是获取这些智能指针所指向的COM接口
ByronLiu 2003-11-13
  • 打赏
  • 举报
回复
请教一下!
spRecordset->PutCursorLocation(adUseClientBatch);中的PutCursorLocation是什么意思?

spStream.GetInterfacePtr()中的GetInterfacePtr是什么意思?

谢谢!!

ByronLiu 2003-11-12
  • 打赏
  • 举报
回复
有没有相关_StreamPtr存取的代码。谢谢!!
Earthdog 2003-11-12
  • 打赏
  • 举报
回复
先存入一个_StreamPtr对象中取,然后构造另外一个_RecordsetPtr,从这个_StreamPtr对象中读取内容
huanyun 2003-11-12
  • 打赏
  • 举报
回复
Clone()
_RecordsetPtr有这个接口啊
新建一个在新的实例上调用该函数 把旧的作为参数就可以了
我花钱买的,结果没用上,太亏了 本系统采用ADO来访问SQL数据库,这里充分应用了C++类封装的功能,根据本系统应用的范围,将访问数据库的功能函数封装在一个类CMyDatabase。 正如前所述,ADO是访问数据库的一个方法,它提供了不同的接口。ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。 _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。 _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。 _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口 ,然后使用_RecordsetPtr执行存储过程和SQL语句。  根据这些,我们将数据库的各种操作封装到CMyDatabase类里。几个主要函数说明如下:

4,011

社区成员

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

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