过年好!一个关于Ado和Com的问题,绝对高手请进入 本人信誉极好,敬请放心!我现在遇到如此棘手问题,我希望实现数据库三层的功能,举例:我在com(中间层)中建立几条和数据库的连接,然后在利用_RecordsetPtr获取查询后的结果集指针,这样结果集便在com中获取,那么我又如何将他以参数的形式在传递给客户端呢?我想这肯定得需要将_RecordsetPtr转换成OleVaraint,可是这是否能转,又如何转换呢?请赐教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 声明[out,retval]IDispatch **pRSSTDMETHODIMP CGetCurrData::ReadData(BSTR name, BSTR pwd, BSTR dsn, BSTR sel, BSTR sel_table, BSTR sel_from, BSTR sel_where, int sign, IDispatch **pRS){ AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here _bstr_t temp; _bstr_t strSQL; if(sign==0) { strSQL=sel; } else { temp="SELECT "; temp+=sel_table; temp+=" FROM "; temp+=sel_from; if(sel_where==L"") { temp+=" WHERE "; temp+=sel_where; } strSQL=temp; } HRESULT hr; _RecordsetPtr pORS; _ConnectionPtr pConn; try{ pConn.CreateInstance(__uuidof(Connection)); pORS.CreateInstance(__uuidof(Recordset)); hr=pConn->Open(dsn,name,pwd,-1); if(FAILED(hr)) _com_raise_error (hr); pORS->CursorLocation = adUseClient; pORS->Open(_variant_t(strSQL),(IDispatch*)pConn,adOpenStatic, adLockReadOnly,adCmdText); if (FAILED(hr)) _com_raise_error (hr); }catch(_com_error &e) { if (m_spObjectContext != NULL) m_spObjectContext->SetAbort(); return e.Error(); }// pORS->putref_ActiveConnection(NULL); *pRS=(IDispatch *)pORS.Detach(); if (m_spObjectContext != NULL) m_spObjectContext->SetComplete(); return S_OK;} _RecordsetPtr转换成OleVaraint1。可以直接用 IRecordset* 不要用 智能指针在idl中 import "xxx.idl"; // 定义了IRecordset 哪个idl[out,retval]IRecordset** pRS 2。当然 [out,retval]IDispatch **pRS 这个也可以 3。象 QueryInterface的方式也行 [in]REFIID rguid, [out, iid_is(rguid)]void** ppv 以上两位,我是要求com和client运行在两台计算机上,那么你们的方法也行吗?那么他们又如何将_RecordsetPtr所指向的内容通过DCOM传到client。我可以和你们交流一下吗?因为我非常急于解决此问题,解决后必有高分相赠!我可以知道你们的qq吗? 请教一个FTP客户端的问题 CStdioFile 急急问题 200分请教一问题:调用IADs::Get时,进程占用句柄数越来越多 请问OnDraw和OnPaint有什么不同呀? 能否把其他的程序嵌入到我的程序中? 再问CreateFileMapping的共享内存的消息通知问题。 高分求《WINDOWS 程序设计》(第五版)源代码 编写流式socket的问题 如何设置客户区视图尺寸大小?在已经设置了窗口大小的情况下. 导入的Icon 图标怎么无法编辑呢??生成各种大小的图标的方法 发邮件的代码?????? 是网络编程高手的进—全部分,送!!!
BSTR sel, BSTR sel_table, BSTR sel_from,
BSTR sel_where, int sign, IDispatch **pRS)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
_bstr_t temp;
_bstr_t strSQL;
if(sign==0)
{
strSQL=sel;
}
else
{
temp="SELECT ";
temp+=sel_table;
temp+=" FROM ";
temp+=sel_from;
if(sel_where==L"")
{
temp+=" WHERE ";
temp+=sel_where;
}
strSQL=temp;
}
HRESULT hr;
_RecordsetPtr pORS;
_ConnectionPtr pConn; try{ pConn.CreateInstance(__uuidof(Connection)); pORS.CreateInstance(__uuidof(Recordset)); hr=pConn->Open(dsn,name,pwd,-1);
if(FAILED(hr)) _com_raise_error (hr);
pORS->CursorLocation = adUseClient;
pORS->Open(_variant_t(strSQL),(IDispatch*)pConn,adOpenStatic,
adLockReadOnly,adCmdText);
if (FAILED(hr)) _com_raise_error (hr); }catch(_com_error &e)
{
if (m_spObjectContext != NULL) m_spObjectContext->SetAbort();
return e.Error();
}
// pORS->putref_ActiveConnection(NULL);
*pRS=(IDispatch *)pORS.Detach();
if (m_spObjectContext != NULL) m_spObjectContext->SetComplete();
return S_OK;
}
在idl中 import "xxx.idl"; // 定义了IRecordset 哪个idl
[out,retval]IRecordset** pRS 2。当然 [out,retval]IDispatch **pRS 这个也可以 3。象 QueryInterface的方式也行
[in]REFIID rguid, [out, iid_is(rguid)]void** ppv