Article View: borland.public.cppbuilder.database.ado
Article #305Re: TStreamAdapter, ADO.Recordset
From: Mark Guerrieri
Date: Fri, 07 Jul 2006 14:08
Date: Fri, 07 Jul 2006 14:08
146 lines
4938 bytes
4938 bytes
> if somebody kows how to read data from
> TADODataset.Recordset into TStreamAdapter and backward
> please give me some example code.
>
Following are excerpts from an inproc COM server DLL I wrote to convert
between Recordsets and XML using streams. You can use the parts that are
relavant to you...
This code assumes you have imported the ADO library, creating the unit
ADODB_TLB.CPP:
#include "AdoDb_TLB.H"
#include <memory>
typedef std::auto_ptr<TStreamAdapter> TStreamAdapterPtr;
typedef std::auto_ptr<TStringStream> TStringStreamPtr;
//---------------------------------------------------------------------------
STDMETHODIMP TRsXmlConvertImpl::RsToXml(LPDISPATCH oRs, BSTR* cXml)
{
HRESULT hResult = S_OK;
IDispatchPtr pDisp(oRs, true);
try
{
*cXml = 0;
if(!pDisp.IsBound())
return E_NOINTERFACE;
StreamPtr pStream = CoStream::Create();
TVariant v;
IUnknownPtr iunk;
OLECHECK(pStream->QueryInterface(IID_IUnknown, (LPVOID*)&iunk));
if(!iunk.IsBound())
throw Exception("Stream interface does not implement the IUnknown
interface");
v = (IUnknown*)iunk;
_RecordsetPtr rs;
OLECHECK(pDisp->QueryInterface(Adodb_tlb::IID__Recordset,
(LPVOID*)&rs));
if(!rs.IsBound())
throw Exception("Object does not implement the IRecordset interface");
OLECHECK(rs->Save(v, adPersistXML));
WideString wStream;
OLECHECK(pStream->ReadText(-1, &wStream));
*cXml = wStream.Detach();
}
catch(Exception& e)
{
hResult = Error(e.Message.c_str(), IID_IRsXmlConvert, E_FAIL);
}
catch(...)
{
hResult = Error(_T("Catastrophic error: internal crash"),
IID_IRsXmlConvert, E_UNEXPECTED);
}
return hResult;
}
//---------------------------------------------------------------------------
STDMETHODIMP TRsXmlConvertImpl::XmlToRs(BSTR cXml, LPDISPATCH* oRs)
{
HRESULT hResult = S_OK;
try
{
if(*oRs != NULL)
(*oRs)->Release();
*oRs = NULL;
if(cXml == 0)
throw Exception("Recordset cannot be created from an empty XML
document");
AnsiString strXml = AnsiString(cXml);
TStringStreamPtr pStream(new TStringStream(AnsiString(cXml)));
if(!pStream.get())
throw Exception("Could not create Stream object");
pStream->Seek(0, soFromBeginning);
TStreamAdapterPtr sa(new TStreamAdapter(pStream.get(), soReference));
if(!sa.get())
throw Exception("Could not create Stream interface");
IUnknownPtr iunk;
OLECHECK(sa->QueryInterface(IID_IUnknown, (LPVOID*)&iunk));
if(!iunk.IsBound())
throw Exception("Stream interface does not implement the IUnknown
interface");
sa.release();
_RecordsetPtr oNewRs;
OLECHECK(CoCreateInstance(CLSID_Recordset, NULL,
CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,
Adodb_tlb::IID__Recordset, (LPVOID*)&oNewRs));
if(!oNewRs.IsBound())
throw Exception("Could not create the Recordset object- MDAC may not
be installed");
oNewRs->CursorLocation = adUseClient;
oNewRs->LockType = adLockBatchOptimistic;
oNewRs->CursorType = adOpenStatic;
OleVariant eParam;
eParam.VType = varError;
eParam.VError = 0x80020004; //DISP_E_PARAMNOTFOUND
TVariant v = (IUnknown*)iunk;
OLECHECK(oNewRs->Open(v, eParam, -1, -1, -1));
OLECHECK(oNewRs->QueryInterface(IID_IDispatch, (LPVOID*)oRs));
}
catch(Exception& e)
{
hResult = Error(e.Message.c_str(), IID_IRsXmlConvert, E_FAIL);
if(*oRs != NULL)
(*oRs)->Release();
*oRs = NULL;
}
catch(...)
{
hResult = Error(_T("Catastrophic error: internal crash"),
IID_IRsXmlConvert, E_UNEXPECTED);
if(*oRs != NULL)
(*oRs)->Release();
*oRs = NULL;
}
return hResult;
}
//---------------------------------------------------------------------------
Mark
Technical Details
Message-ID:
<44ae6ad2$1@newsgroups.borland.com>Path:
arc1-ca.pugleaf.net!g2news2.google.com!news2.google.com!atl-c05.usenetserver.com!news.usenetserver.com!peer01.west.cox.net!cox.net!newshub.sdsu.edu!logbridge.uoregon.edu!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mailReferences:
<44ace123@newsgroups.borland.com>Show Full Headers
Complete Article Headers
X-Google-Thread: 10698b,45006805705c80ba X-Google-Attributes: gid10698b,public X-Google-Language: ENGLISH,ASCII-7-bit From: "Mark Guerrieri" <mguerrieri@no_spam_verizon.net> Newsgroups: borland.public.cppbuilder.database.ado References: <44ace123@newsgroups.borland.com> Subject: Re: TStreamAdapter, ADO.Recordset Date: Fri, 7 Jul 2006 10:08:11 -0400 Lines: 148 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2869 X-RFC2646: Format=Flowed; Original X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869 NNTP-Posting-Host: 71.248.209.167 Message-ID: <44ae6ad2$1@newsgroups.borland.com> X-Trace: newsgroups.borland.com 1152281298 71.248.209.167 (7 Jul 2006 07:08:18 -0700) Path: arc1-ca.pugleaf.net!g2news2.google.com!news2.google.com!atl-c05.usenetserver.com!news.usenetserver.com!peer01.west.cox.net!cox.net!newshub.sdsu.edu!logbridge.uoregon.edu!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail