Microsoft KB Archive/225131

= How To Implement Visual C++ COM Objects Returning Recordsets =

Article ID: 225131

Article Last Modified on 7/1/2004

-

APPLIES TO


 * Microsoft Active Server Pages 4.0
 * Microsoft ActiveX Data Objects 2.7
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition
 * Microsoft Internet Information Server 4.0
 * Microsoft Internet Information Services 5.0
 * Microsoft Data Access Components 2.5

-



This article was previously published under Q225131



SUMMARY
This article describes, by example, how to implement a Visual C++ Component Object Model (COM) object that returns a recordset to Active Server Pages (ASP).

Implementing this incorrectly can result in memory leaks or one of the following errors:

The operation requested by the application is not allowed if the object is closed.

-or-

Type Mismatch

-or-

error 'ASP 0115' - A trappable error occured in an external object



MORE INFORMATION
Use the following steps to implement a method that returns a recordset from a Visual C++ COM object to Active Server Pages.  Create an ATL DLL project called PassRs. Insert an ATL object named PassRsObj.  Add a method with the following information: Method Name: TestMethod Parameters : [out, retval] LPDISPATCH* ppRecordset   Include the following line in the object's implementation file:   Implement the method as follows:
 * 1) import "msado15.dll" no_namespace rename("EOF", "adoEOF")

Note You must change UID= and pwd= to the correct values before you run this code. Make sure that UID has the appropriate permissions to perform this operation on the database.

STDMETHODIMP CPassRsObj::TestMethod(LPDISPATCH *ppRecordset ) {   _ConnectionPtr pConn; _RecordsetPtr pRs; pConn.CreateInstance(__uuidof(Connection)); pRs.CreateInstance(__uuidof(Recordset));

pConn->Open("DSN=pubs;uid= ;pwd= ;", (BSTR) NULL, (BSTR) NULL, -1);

//Client side cursor is required for disconnected recordsets pRs->CursorLocation = adUseClient;

pRs->Open( "select * from authors",              pConn.GetInterfacePtr,               adOpenKeyset, adLockOptimistic, -1);

// Disconnect the recordset pRs->PutRefActiveConnection(NULL);

//Clone the recordset. //NOTE: Recordset to be cloned must support bookmarks pRs->Clone(adLockOptimistic)->QueryInterface(IID_IDispatch, (void**) ppRecordset);

pRs->Close; pConn->Close;

pRs = NULL; pConn = NULL;

return S_OK; }                     Create an ASP page with the following code: <% Dim rsTest, oTestPassRs

Set oTestPassRs = Server.CreateObject("PassRs.PassRsObj") Set rsTest = oTestPassRs.TestMethod

Do Response.Write ( "Value in Record = " & rsTest(1) & "" ) rsTest.MoveNext Loop until rsTest.EOF

rsTest.Close Set rsTest = Nothing Set oTestPassRs = Nothing %>                   </li></ol>

<div class="references_section">