🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.cppbuilder.database.ado
Article #305

Re: TStreamAdapter, ADO.Recordset

#305
From: Mark Guerrieri
Date: Fri, 07 Jul 2006 14:08
146 lines
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-mail
References: <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