# The C++ QueryResult Class

> The QueryResult class is used to control the DataSource object returned by methods `executeQuery()` and `executePreparedQuery()` of classes McoSqlEngine, RemoteSqlEngine and McoMultithreadedSqlEngine.

> ### For an overview see page C++ Classes

> The QueryResult class inherits its principle methods from classes ResultSet and DataSource. These methods are listed below.

> bool isNumberOfRecordsKnown() | Returns `true` if method `nRecords()` can be called successfully
> int64_t nRecords(Runtime* runtime) | Returns the number of Record objects in the result set
> Cursor* records() | Returns a Cursor over the result set
> Vector<Field>* fields() | Returns a Vector (a variable length array) of Field objects
> Field* findField(char const * name ); | Find the Field in the DataSource by `name` (as a `char` array)
> Field* findField(String * name ); | Find the Field in the DataSource by `name` (as a String)
> void extract(...) | Extract Record components to the corresponding C struct

> Typically a QueryResult object is instantiated in a function or method that releases it on return as the QueryResult object goes out of scope. (Note that failing to release a DataSource object can lead to an application deadlock. The QueryResult class helps avoid this as the DataSource method `release()` is called in the QueryResult `destructor` which also correctly releases the DataSource in case of a thrown exception.)

> ### Example

> The most common use of the QueryResult class is illustrated in the following code snippet:

>         void show_results( char * sql )
>         {
>             QueryResult result(engine.executeQuery(sql));

>             Cursor* cursor = result->records();
>             while (cursor->hasNext())
>             {
>                 Record* rec = cursor->next();
>                 _Person p;
>                 // Extract the Person record to the corresponding struct
>                 result->extract(rec, &p, sizeof(p));
>                 printf("\t\t%d) Name=%s, Ordinal=%u\n", count, p.name, p.ordinal );
>             }
>         }

> (Please see page Processing Query Results for further details.)