|
- /*! \page query Fetching Query Results
-
- First read about \ref stat "how to prepare" statements
-
- \section query_fetch Fetching a Results
-
- The result is represented by cppdb::result class. It stores the query result. The prepared statement result can be fetched
- using \ref cppdb::statement::query() "statement::query()" function.
-
- \code
- cppdb::statement st = sql << "SELECT name,age FROM students";
- cppdb::result r = st.query();
- \endcode
-
- \note \ref cppdb::statement "statement" can be converted to \ref cppdb::result "result" automatically that actually causes calling \ref cppdb::statement::query() "query()" function.
-
- So the same code above can be written using syntactic sugar as following:
-
- \code
- cppdb::result r = sql << "SELECT name,age FROM students";
- \endcode
-
- \section query_meta Fetching Meta-data on the Result:
-
- Following meta-data can be fetched about the result:
-
- - Number of columns using \ref cppdb::result::cols() "cols()" member function.
- - The name of columns using \ref cppdb::result::name() "name()" member function. These names can be used
- for retrieval of the data using \ref cppdb::result "fetch()" member functions.
-
- \section query_iter Getting the Result Data
-
- In order to iterate over rows of the result you should use \ref cppdb::result::next() "next()" function that
- returns true if the next row exits and false otherwise. Once \ref cppdb::result::next() "next()" returned true
- you can fetch the values using \ref cppdb::result "fetch()" family of functions.
-
- There are 3 kinds of prototypes for \c fetch() functions.
-
- -# <tt>bool fetch(int column,type &value)</tt> - fetch the value from column (index starts from 0) returning false if the value in NULL.
- -# <tt>bool fetch(std::string const &column_name,type &value)</tt> - fetch the value from column using its name returning false if the value in NULL.
- -# <tt>bool fetch(type &value)</tt> - fetch the value from the next column in current row (starting from 0) returning false if the value in NULL.
-
- Where type is one of C++ numeric types, \c std::string for text, \c std::tm for date-time types and \c std::ostream for Blob types. Fetching
- a value would try to do the best in casting between result type and the type you provide, for example fetching numeric or date-time types
- would convert them to string representation, it would try to do the casting between string and std::tm and numeric types if possible.
-
- If conversion fails, cppdb::bad_value_cast is thrown.
-
- For example:
-
- \code
- cppdb::result r = sql << "SELECT name,age FROM users WHERE age > ?" << 18.0;
- while(r.next()) {
- std::string name;
- double age;
- r.fetch(0,name);
- r.fetch(1,age);
- std::cout << name << " is " << age << " years old" << std::endl;
- }
- \endcode
-
- Another way to get values directly is by using cppdb::result::get(int) or cppdb::result::get(std::string const &) template member functions
- that allow to fetch values from columns directly using column index or column name:
-
- \code
- cppdb::result r = sql << "SELECT name,age FROM users WHERE age > ?" << 18.0;
- while(r.next()) {
- std::cout << r.get<std::string>("name") << " is " << r.get<double>("age") << " years old" << std::endl;
- }
- \endcode
-
- Unlike \c fetch() function, \c get() functions throw cppdb::null_value_fetch if the value was null.
-
-
- \section query_syntacx Syntactic Sugar
-
- There is also overloaded operator ">>" that provide syntactic sugar for fetching data and the example above an be written as:
-
- \code
- cppdb::result r = sql << "SELECT name,age FROM users WHERE age > ?" << 18.0;
- while(r.next()) {
- std::string name;
- double age;
- r >> name >> age;
- std::cout << name << " is " << age << " years old" << std::endl;
- }
- \endcode
-
- \note Operators \c >> function remain variable unchanged when the result is NULL value.
-
- In order to fetch both meta-data and the value you can use \ref cppdb::into "into()" manipulator
- that passes both reference to the value and a tag. For example
-
- \code
- cppdb::null_tag_type age_tag,name_tag;
- std::string name;
- double age;
- r >> cppdb::into(name,name_tag) >> cppdb::into(age,age_tag);
- \endcode
-
- \section query_row Fetching a Single Row
-
- Sometimes it is useful to fetch a single row of data and not iterate over it. This can be done using cppdb::statement::row()
- function that works like \ref cppdb::statement::query() "query()" but also calls \ref cppdb::result::next() "next()" first time
- and checks if more then one rows had been fetched (in which case it throws \ref cppdb::multiple_rows_query "multiple_rows_query" exception).
-
- For example:
-
- \code
- cppdb::statement st = sql<<"SELECT password WHERE username=?" << user
- cppdb::result r = st.row();
-
- if(!r.empty()) {
- if(pass == r.get<std::string>(0)) {
- // ok
- }
- else {
- // wrong password
- }
- }
- else {
- // no such user
- }
- \endcode
-
- You can also use cppdb::row manipulator to make it shorter:
-
- \code
- cppdb::result r = sql<<"SELECT password WHERE username=?" << user << cppdb::row
- if(!r.empty())
- ...
- else
- ...
- \endcode
-
- You can also use operator \c >> right after \ref cppdb::row "row" manipulator, but in case
- the empty result was fetched a \ref cppdb::empty_row_access "empty_row_access" exception would be thrown.
-
- \code
- double age;
- sql<<"SELECT age WHERE username=?" << user << cppdb::row >> age;
- \endcode
-
-
- */
|