ActiveConnection, CommandText, CommandTimeout, CommandType, Size, and Direction Properties Example (VC++)

Microsoft ActiveX Data Objects (ADO)

ActiveConnection, CommandText, CommandTimeout, CommandType, Size, and Direction Properties Example (VC++)

This example uses the ActiveConnection, CommandText, CommandTimeout, CommandType, Size, and Direction properties to execute a stored procedure.

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

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

//Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActiveConnectionX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveConnectionX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActiveConnectionX Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void ActiveConnectionX(void)
{
    HRESULT hr = S_OK;  

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection    = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr   pRstByRoyalty  = NULL;
    _RecordsetPtr   pRstAuthors    = NULL;
    _ParameterPtr   pPrmByRoyalty  = NULL;

    // Define other variables
    IADORecordBinding   *picRs = NULL; // Declare interface pointer.
    CEmployeeRs emprs;                 // C++ class object
    int intRoyalty;
    VARIANT vtroyal;
    _bstr_t strAuthorId;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

try
    {
    //Define a command object for a stored procedure. 

    TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
    hr = pConnection->Open(strCnn,"","",NULL);

    TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));

    pCmdByRoyalty->ActiveConnection = pConnection;
    pCmdByRoyalty->CommandText = "byRoyalty";
    pCmdByRoyalty->CommandType = adCmdStoredProc;
    pCmdByRoyalty->CommandTimeout = 15;

    //Define stored procedure's input parameter. 
    printf("Enter Royalty :  ");
    scanf("%d",&intRoyalty);

    //Assign Integer value 
    vtroyal.vt = VT_I2;
    vtroyal.iVal  = intRoyalty;

    TESTHR(pPrmByRoyalty.CreateInstance(__uuidof(Parameter)));
    pPrmByRoyalty->Type = adInteger;
    pPrmByRoyalty->Size = 3;
    pPrmByRoyalty->Direction = adParamInput;
    pPrmByRoyalty->Value = vtroyal;
    pCmdByRoyalty->Parameters->Append(pPrmByRoyalty);

    //Create a recordset by executing a command. 
    pRstByRoyalty = pCmdByRoyalty->Execute(NULL,NULL,adCmdStoredProc); 

    //Open the authors table to get author names for display.

    TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
    hr = pRstAuthors->Open("authors",
        strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

    //Open an IADORecordBinding interface pointer which we'll 
    //use for Binding Recordset to a class    
    TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

    //Bind the Recordset to a C++ Class here    
    TESTHR(picRs->BindToRecordset(&emprs));

    //Print current data in the recordset ,adding author names 
    //from author table. 
    printf("Authors With %d Percent Royalty",intRoyalty);

    while(!(pRstByRoyalty->EndOfFile))
    {
        strAuthorId = pRstByRoyalty->Fields->Item["au_id"]->Value;
        pRstAuthors->Filter = "au_id = '"+strAuthorId+"'";
        printf("\n\t%s, %s %s",
           emprs.lau_idStatus == adFldOK ? emprs.m_szau_id : "<NULL>",
           emprs.lau_fnameStatus == adFldOK ? emprs.m_szau_fname : 
           "<NULL>",
           emprs.lau_lnameStatus == adFldOK ? emprs.m_szau_lname : 
           "<NULL>");
        pRstByRoyalty->MoveNext();
    }

    // Clean up objects before exit
    pRstByRoyalty->Close();
    pRstAuthors->Close();

    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();
        pConnection->Close(); 
    }

catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);
        printf("Source : %s \n Description : %s 
            \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      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;
    long      nCount  = 0;
    long      i     = 0;

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

ActiveConnectionX.h:

#include "icrsint.h"

//This Class extracts fname,lastname 

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column au_id is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_id,
         sizeof(m_szau_id), lau_idStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname, 
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR m_szau_id[20];
    ULONG lau_idStatus;

    CHAR m_szau_fname[40];
    ULONG lau_fnameStatus;

    CHAR   m_szau_lname[40];
    ULONG  lau_lnameStatus;
};