MySQLpp
Работа с MySQL из C++ становится приятной и удобной при использовании библиотеки mysql++.
Данная библиотека представляет собой кроссплатформенное решение, написанное на С++, предоставляет богатый набор классов и позволяет создавать эффективные проги. В общем это обертка MySQL’s C API в стиле STL.
Взять ее можно тут. Как установить описано там же.
По указанной ссылке можно скачать последнюю версию библиотеки, которая доступна как для windows так и для linux.
Пользовательский мануал на англ. языке тут.
Для того, чтобы начать ей пользоваться достаточно использовать мини мануал.
Для использования библиотеки необходимо подключить файл:
#include <mysql++.h>Для тех, кто не любит использовать пространства имен следует добавить:
using namespace mysqlpp;или дописывать ко всем элементам библиотеки mysqlpp::.
Класс Connection обеспечивает подключение и аутенфикацию с базе данных.
Класс имеет два конструктора:
Connection(bool te=true) — создание экземпляра класса, без подключения к бд
Connection (const char *db, const char *server=0, const char *user=0, const char *password=0, unsigned int port=0) — создание экземпляра класса с подключением к указанной бд по указанным параметрам. Думаю, что названия параметров говорят сами за себя и не требуют пояснений
client_version() — возвращает строку типа string, содержащую версию библиотеки.
connect (const char *db=0, const char *server=0, const char *user=0, const char *password=0, unsigned int port=0) — то же самое, что и описанный выше конструктор, применяется в случае использования конструктора Connection(true).
connected() — возвращает true, в случае если выполнено подключение к базе и false, если подключение не выполнено.
disconnect() — выполнить отключение от базы данных.
error() — возвращает последнюю ошибку.
query (const char *qstr=0) — возвращает объект типа query, позволяющий выполнить запрос (об этом ниже).
count_rows (const std::string &table) — возвращает результат типа unsigned long, количество строк в указанной таблице table.
Класс Query поддерживает метод << аналогично std::ostream.
В имеет следующие методы:
str() — возвращает строковое значение запроса. Становится невалидным после выполнения запроса.
store() — возвращает результат запроса, типа StoreQueryResult.
execute() — выполнить запрос, не требующий возвращения данных, метод возвращает результат SimpleResult.
Класс StoreQueryResult — результат запроса. Представляет собой набор mysqlpp::Row — элементы запроса.
num_rows() — возвращает количество строк
empty() — возвращает true, в случае, если запрос ничего не вернул и false, если запрос вернул данные.
Класс Row — строка — результат запроса, который представляет собой аналог std::map.
Сначала следует получить StoreQueryResult::iterator при разыменовании которого получим Row.
Получить элементы можно по номеру, например, Row[1] или по названию поля Row[«element»].
К int преобразовывается легко, а для std::string следует делать явное преобразование.
Класс SimpleResult, у этого класса нас может интересовать всего один единственный метод
rows() — возвращает количество строк, подвергшися изменению, во время вызова execute()
Самый простой пример:
#include «cmdline.h»
#include «printdata.h»
#include <mysql++.h>
#include #include using namespace std;
int
main(int argc, char *argv[])
{
// Get database access parameters from command line
const char* db = 0, *server = 0, *user = 0, *pass = "";
if (!parse_command_line(argc, argv, &db, &server, &user, &pass)) {
return 1;
}
// Connect to the sample database.
mysqlpp::Connection conn(false);
if (conn.connect(db, server, user, pass)) {
// Retrieve a subset of the sample stock table set up by resetdb
// and display it.
mysqlpp::Query query = conn.query(«select item from stock»);
if (mysqlpp::StoreQueryResult res = query.store()) {
cout << «We have:» << endl;
for (size_t i = 0; i < res.num_rows(); ++i) {
cout << '\t' << res[i][0] << endl;
}
}
else {
cerr << «Failed to get item list: » << query.error() << endl;
return 1;
}
return 0;
}
else {
cerr << «DB connection failed: » << conn.error() << endl;
return 1;
}
}
Вот еще.
#include <mysql++.h>
#include using namespace mysqlpp;
using namespace std;
//создаем экзмемпляры необходимых объектов
Connection conn;
StoreQueryResult queryres;
string querysring;
int main()
{
try
{
conn.connect(«database», «dataserver», «datauser», «password»); //пробуем подключиться к базе
}
catch (ConnectionFailed err) //перехватываем возможное исключение типа ConnectionFailed
{
cout << «Не удалось подключится к базе данных, причина: » << err.what() << endl;
return 1;
}
if(conn.connected()) //проверяем, подключены ли мы к базе данных
{
querystring = «SELECT * FROM Datatable»; //инициализируем строку запроса
queryres = conn.query(querystring.c_str()).store(); //выполняем запрос
if(!res.empty()) //если что-то вернулось
{
for(int rc = 0; rc < (int)queryres.num_rows(); ++i) //построчно выводим на экран
cout << queryres[rc][«colname_one»] << queryres[rc][«colname_sec»] << endl;
} else
cout << «Запрос не вернул данных» << endl; //иначе сообщаем что ничего не вернулось
conn.disconnect(); //отключаемся от базы данных
} else
{
cout << «Подключение к базе данных потеряно...» << endl; //иначе сообщаем что коннект отвалился
return 1;
}
}
В случае ошибки — необходимо ловить исключения типа ConnectionFailed, которые имеют метод what(), возвращающий текстовое описание проблемы (так же у класса ConnectionFailed есть метод errnum (), возвращающий номер ошибки).
После успешного подключения следует проверять еще раз, подключены ли мы, т.к. в случае нестабильной связи или по иным причинам — соединение может успеть отвалиться. В случае успешной проверки связи, инициализируем строку запроса querystring, наш запрос имеет вид: “SELECT * FROM Datatable”, что означает вернуть все абсолютно все записи из некой таблицы Datatable. После этого вызываем метод query, класса соединения, и у возвращенного объекта, вызываем метод store(), возвращенный результат запроса сохраняем в queryres. Далее проверяем, не пуст ли результат. Если нет — построчно выводим записи на экран.
В классе StoreQueryResult обратиться к соотвествующему столбцу можно по его имени, например, queryres[rc][«colname_sec»] — обращаемся к rc-ой строке и столбцу под названием colname_one.
После окончания работы с бд следует обязательно закрыт соединение, что мы и делаем вызывая метод disconnect().
Для того, чтобы база корректно работала с кириллическими символами, необходимо выполнить запрос:
querystring = "SET CHARSET UTF8"; //задаем кодировку
conn.query(querystring).execute(); //выполняем запрос
В данном примере указана кодировка UTF8, как основная на современных Linux системах. Вам следует задать кодировку вашей системы, для корретной обработки киррилицы.
Для компилирования программ с MySQLpp следует подключать библиотеки mysqlpp и mysql!
Для компиляции программы следуюет выполнить команду:
Удачи!