描述:
本人信誉极好,敬请放心!我现在遇到如此棘手问题,我希望实现数据库三层的功能,举例:我在com(中间层)中建立几条和数据库的连接,然后在利用_RecordsetPtr获取查询后的结果集指针,这样结果集便在com中获取,那么我又如何将他以参数的形式在传递给客户端呢?我想这肯定得需要将_RecordsetPtr转换成OleVaraint,可是这是否能转,又如何转换呢?请赐教
解决方案1:
study
解决方案2: _RecordsetPtr转换成OleVaraint
1。可以直接用 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
声明[out,retval]IDispatch **pRS
STDMETHODIMP 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;
}