Handler Property Example (VC++)

Microsoft ActiveX Data Objects (ADO)

Handler Property Example (VC++)

This example demonstrates the RDS DataControl object Handler property. (See DataFactory Customization for more details.)

Assume the following sections in the parameter file, MSDFMAP.INI, located on the server:

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Your code looks like the following. The command assigned to the SQL property will match the AuthorById identifier, and retrieve a row for author, Michael O'Leary. Although the Connect property in your code specifies the Northwind data source, that data source will be overwritten by the MSDFMAP.INI connect section. The DataControl object Recordset property is assigned to a disconnected Recordset object purely as a coding convenience.

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

void HandlerX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    If(FAILED(::CoInitialize(NULL)))
        return;

     HandlerX();

     printf("Press any key to continue...");
     getch();
     ::CoUninitialize();
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//          HandlerX Function                           //
//                                                      //
//////////////////////////////////////////////////////////

void HandlerX(void) 
{
   HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRst = NULL;

    //Define RDS object pointers.
    RDS::IBindMgrPtr dc;

    try
    {
        TESTHR(dc.CreateInstance(__uuidof(RDS::DataControl)));
        dc->Handler = "MSDFMAP.Handler";
        dc->Server = "http://srv";
        dc->Connect = "Data Source=AuthorDatabase";
        dc->SQL = "AuthorById(267-41-2394)";

        // Retrieve the record.
        dc->Refresh();

        // Use another Recordset as a convenience.
        pRst = dc->GetRecordset();
        printf("Author is %s %s",(LPSTR) (_bstr_t) pRst->Fields->
            GetItem("au_fname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_lname")->Value);
        pRst->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pRst->GetActiveConnection());
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintProviderError Function                     //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                        
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}