This example uses the MaxRecords property to open a Recordset containing the 10 most expensive titles in the Titles table.
#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\
no_namespace rename("EOF","EndOfFile")
#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "MaxRecordsX.h"
// Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MaxRecordsX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
//////////////////////////////////////////////////////////////
// //
// Main Function //
// //
//////////////////////////////////////////////////////////////
void main()
{
if(FAILED(::CoInitialize(NULL)))
return;
MaxRecordsX();
::CoUninitialize();
}
// MaxRecordsX() Function
void MaxRecordsX(void)
{
// Define ADO ObjectPointers
// Initialize Pointers on define
// These are in the ADODB :: namespace
_RecordsetPtr pRstTemp = NULL;
// Define Other Variables
IADORecordBinding *picRs = NULL; // Interface Pointer Declared
CTitlesRs titlers; // C++ Class Object
HRESULT hr = S_OK;
try
{
//Assign Connection String to Variable
_bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
"Initial Catalog=Pubs;User Id=sa;Password=;");
// Open Recordset containing the 10 most expensive titles in the
// Titles table.
TESTHR(pRstTemp.CreateInstance(__uuidof(Recordset)));
pRstTemp->MaxRecords=10;
pRstTemp->Open("SELECT title,price FROM Titles "
"ORDER BY Price DESC",strCnn,adOpenForwardOnly,
adLockReadOnly,adCmdText);
// Open an IADORecordBinding interface pointer which
// we will use for binding Recordset to a class
TESTHR(pRstTemp->QueryInterface(
__uuidof(IADORecordBinding),(LPVOID*)&picRs));
// Bind the Recordset to a C++ class here
TESTHR(picRs->BindToRecordset(&titlers));
// Display the contents of the Recordset
printf("Top Ten Titles by Price:\n\n");
while(!(pRstTemp->EndOfFile))
{
printf("%s --- %6.2lf\n\n",titlers.lau_TitleStatus ==
adFldOK ? titlers.m_szau_Title : "<NULL>",
titlers.lau_PriceStatus == adFldOK ?
titlers.m_szau_Price : 0.00);
pRstTemp->MoveNext();
}
// Clean up objects before exit.
pRstTemp->Close();
if(picRs)
picRs->Release();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
// Pass a connection pointer accessed from the Recordset.
_variant_t vtConnect = pRstTemp->GetActiveConnection();
// GetActiveConnection returns connect string if connection
// is not open, else returns Connection object.
switch(vtConnect.vt)
{
case VT_BSTR:
PrintComError(e);
break;
case VT_DISPATCH:
PrintProviderError(vtConnect);
break;
default:
printf("Errors occured.");
break;
}
}
};
//////////////////////////////////////////////////////////////
// //
// 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("\t Error Number :%x \t %s",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);
}
MaxRecordsX.h:
// MaxRecordsX.h
#include "icrsint.h"
// This class extracts titles and type from the Titles table
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
// Column title is the 1st field in the Recordset
ADO_VARIABLE_LENGTH_ENTRY2(1,adVarChar,m_szau_Title,
sizeof(m_szau_Title),lau_TitleStatus,FALSE)
// Column price is the 2nd field in the Recordset
ADO_VARIABLE_LENGTH_ENTRY2(2,adDouble,m_szau_Price,
sizeof(m_szau_Price),lau_PriceStatus,FALSE)
END_ADO_BINDING()
public:
CHAR m_szau_Title[81];
ULONG lau_TitleStatus;
DOUBLE m_szau_Price;
ULONG lau_PriceStatus;
};