_RecordsetPtr 对象转换成 tagvariant类型 ???

sin816 2008-11-13 03:53:06
相关代码如下:

_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
_variant_t sqlstr = "select country from World";
m_pRecordset->Open(sqlstr,
_variant_t((IDispatch*)theApp.m_pConnection,true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
fun(m_pRecordset->GetCollect("country")));


fun(const VARIANT& SourceData);
运行到fun语句时会提示:the specified source is not an ADO recordset Object;

如果把fun()改成fun(m_pRecordset);
编译时会提示:
cannot convert parameter 1 from 'class _com_ptr_t<class _com_IIID<struct _Record
set,&struct __s_GUID _GUID_00000556_0000_0010_8000_00aa006d2ea4> >' to 'const struct tagVARIANT &'


既要保证fun调用的参数是查询返回的记录集,又要保证该参数是const VARIANT&。该怎么办啊?
请大家棒棒忙,我google baidu过都没解决
...全文
241 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sin816 2008-11-14
  • 打赏
  • 举报
回复
1.那个是复制上来的时候不小心弄的 嘿嘿

2.

CMapXDataset mydataset;
CMapXDatasets mydatasets;
mydatasets = m_ctrlMapX.GetDatasets();
mydataset = mydatasets.Add(miDataSetADO, m_pRecordset->GetCollect("country"));//上面抽象的fun()
//
//CMapXDataset Add(short Type, const VARIANT& SourceData, LPCTSTR Name=NULL, long GeoField=0)
//说明:这是VC结合MpaX软件 进行数据绑定的语句,这里只是调用而已。


3.(_bstr_t)m_pRecordset->GetCollect("country")
编译错误:cannot convert parameter from 'class _bstr_t' to 'const struct tagVARIANT &'
一条晚起的虫 2008-11-14
  • 打赏
  • 举报
回复
//Add(miDataSetADO, m_pRecordset->GetCollect("country"));
_variant_t vt;
vt = Add(miDataSetADO, vt);
Add(miDataSetADO, vt); //?
//看调试信息,似乎是在_variant_t转VARIANT的时候出错了...
sin816 2008-11-14
  • 打赏
  • 举报
回复
试过了,编译时会提示:
cannot convert parameter 2 from 'class _com_ptr_t <class _com_IIID <struct _Record
set,&struct __s_GUID _GUID_00000556_0000_0010_8000_00aa006d2ea4> >' to 'const struct tagVARIANT &'

这可够烦人的。

srxumin 2008-11-14
  • 打赏
  • 举报
回复
你直接传个_RecordsetPtr类型的引用到add函数中,试过吗?
shakaqrj 2008-11-14
  • 打赏
  • 举报
回复
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("select country from World",
_variant_t((IDispatch*)theApp.m_pConnection,true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
fun(m_pRecordset->GetCollect("country"));
sin816 2008-11-14
  • 打赏
  • 举报
回复
回复srxumin:country字段是nvarchar类型,数据库用的是SQL server 2000

fun()函数其实是我当初为表达方便 抽象出来的。
实际上是:Add(short Type, const VARIANT& SourceData, LPCTSTR Name=NULL, long GeoField=0)
其中第一个参数是由控件提供,没问题;第三第四个参数是可省的;关键是第二个参数。

Add(miDataSetADO, m_pRecordset->GetCollect("country"));这么调用时,语法是没问题啦。

运行至此提示:the specified source is not an ADO recordset Object

我的理解是m_pRecordset->GetCollect("country")作为参数满足了类型const VARIANT& SourceData的要求,但已不再是ADO recordset Object了;但要把m_pRecordSet直接作为参数,不满足类型要求,编译都通不过。
sin816 2008-11-14
  • 打赏
  • 举报
回复
回复srxumin:country字段是nvarchar类型,数据库用的是SQL server 2000

fun()函数其实是我当初为表达方便 抽象出来的。
实际上是:Add(short Type, const VARIANT& SourceData, LPCTSTR Name=NULL, long GeoField=0)
其中第一个参数是由控件提供,没问题;第三第四个参数是可省的;关键是第二个参数。

Add(miDataSetADO, m_pRecordset->GetCollect("country"));这么调用时,语法是没问题啦。

运行至此提示:the specified source is not an ADO recordset Object

我的理解是m_pRecordset->GetCollect("country")作为参数满足了类型const VARIANT& SourceData的要求,但已不再是ADO recordset Object了;但要把m_pRecordSet直接作为参数,不满足类型要求,编译都通不过。
sin816 2008-11-14
  • 打赏
  • 举报
回复
问题搞定 结贴咯。谢谢大家的忍心啊 哈哈
COleVariant rsVt;
rsVt.vt = VT_DISPATCH;
rsVt.pdispVal = m_pRecordset;//查询数据库返回的记录集
rsVt.pdispVal->AddRef();
fun(rsVt);
//原型fun(const VARIANT& SourceData);
srxumin 2008-11-14
  • 打赏
  • 举报
回复
原来你的函数原形都在注释里,不好意思

fun(const VARIANT& SourceData);
使用fun(m_pRecordset->GetCollect("country"));调用应该没问题的,你再试试看
srxumin 2008-11-14
  • 打赏
  • 举报
回复
1、Add(miDataSetADO, m_pRecordset->GetCollect("country"));
你的Add原形是什么呢?关键的东西还是没贴出来。看出错信息,应该是_variant_t型的吧?
2、country字段又是什么类型呢?

你的错误就是类型转换错误,把你关键函数的类型贴一下吧
内存泄漏 2008-11-14
  • 打赏
  • 举报
回复
你的fun函数到底是要什么类型的参数??直接强制转换不行吗??
srxumin 2008-11-13
  • 打赏
  • 举报
回复
1、你的右括号好像多了一个,编译能通过?
2、请把你fun函数的整个代码贴出来
3、如果你的fun需要的参数为字符串类型,你需要这样写:
fun((_bstr_t)m_pRecordset->GetCollect("country"));
sin816 2008-11-13
  • 打赏
  • 举报
回复
单步调试如下:

inline _variant_t::_variant_t(VARIANT& varSrc, bool fCopy) throw(_com_error)
{
if (fCopy) {
::VariantInit(this);
_com_util::CheckError(::VariantCopy(this, &varSrc));
} else {
memcpy(this, &varSrc, sizeof(varSrc)); //调试到此就无法再往下继续
V_VT(&varSrc) = VT_EMPTY;
}
}



到memcpy语句时,弹出Find Source对话框,提示:Please enter the path for MEMCPY.ASM


刚接触vc对此不知何解,请赐教
一条晚起的虫 2008-11-13
  • 打赏
  • 举报
回复
运行到fun语句时会提示:the specified source is not an ADO recordset Object;
//进入到fun内部看看。

4,011

社区成员

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

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