Here's an example of how Comet generated wrappers for ADO can make your client code a whole lot neater:

com_ptr<ADODB::_Recordset> rs = ADODB::Recordset::create();

rs->Fields->Append(L"Abbreviation", ADODB::adVarChar, 1);
rs->Fields->Append(L"Id", ADODB::adInteger);
rs->Fields->Append(L"Description",  ADODB::adVarChar, 255 );
rs->Open();

safearray_t<variant_t> fields(3);
fields[1] = L"Abbreviation";
fields[2] = L"Id";
fields[3] = L"Description";

safearray_t<variant_t> values(3);

values[1] = L"E";
values[2] = 0;
values[3] = L"Green";
rs->AddNew( fields, values );

values[1] = L"B";
values[2] = 1;
values[3] = L"Blue";
rs->AddNew( fields, values );

// etc, etc

rs->MoveFirst();
while (!rs->EOF)
{
    std::cout << rs->Fields->Item[L"Abbreviation"]->Value << '\t'
              << rs->Fields->Item[L"Id"]->Value << '\t'
              << rs->Fields->Item[L"Description"]->Value << std::endl;
    rs->MoveNext();
}