Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
21st
Фев
Работа с MySQL в С++ с использованием библиотеки mysql++
Posted by Chas under Журнал, Статьи
Под впечатлением от предыдущей статьи форумчанина Psycho-coder, я решил написать свой небольшой мануал по работе с СУБД MySQL, используя библиотеку mysql++. Данная библиотека является кроссплатформенным решением, написанным на С++, и предоставляет богатый набор классов, позволяяя создавать эффективные приложения.
Олег Кутков
by Oleg Kutkov elenbert@gmail.com
Так как моей основной операционной системой является Linux, я буду рассматривать процесс создания приложения под Unix платформу. Под платформу Windows все будет практически точно так же, за исключением собственно подключения библиотеки и ее заголовочных файлов к IDE (MS Visual studio, Dev-c++). Для создания приложения в среде Unix наличие IDE, как и собственно графической оболочки, не необходимо, процесс написания и компиляции может проходить в голой консоли.
Для начала необходимо скачать саму библиотеку, это можно сделать по следующим ссылкам:
- Исходный код [2]
- Бинарные RPM сборки (следует попробовать разные версии, т. к. некоторые могут не установиться):
- RPM ver1 [3]
- RPM ver2 [4]
- RPM ver3 [5]
- Версия для MS Visual C++ [6]
Я не буду описывать установку библиотеки для каждой платформы, т. к. это выходит за рамки данной статьи. Лучше познакомиться с библиотекой, рассмотреть ее классы и создать простое приложение, которое будет подключаться к базе данных и запрашивать данные из таблицы, добавлять новые, модифицировать существующие записи.
Для того чтобы воспользоваться возможностями библиотеки, следует подключить заголовочный файл mysql++.h и пространство имен mysqlpp:
using namespace 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() – возвращает последнюю ошибку.
- count_rows (const std::string &table) – возвращает результат типа unsigned long, количество строк в указанной таблице table.
MySQL++ – это специализированная библиотека так называемых «оберточных» (wrapper) методов для прикладного программного интерфейса C API для СУБД MySQL. Главная цель этой библиотеки – сделать работу с SQL-запросами такой же простой, как работа с STL-контейнерами.
MySQL++ обеспечивает поддержку большинства разнообразных способов и приемов работы с базами данных.
Класс Connection имеет еще ряд методов, но они нам пока неинтересны. Теперь рассмотрим класс query. В нем нас интересуют следующие методы:
- store() – возвращает результат запроса, типа StoreQueryResult.
- execute() – выполняет запрос, не требующий возвращения данных, метод возвращает результат SimpleResult.
Класс StoreQueryResult – именно он позволяет обратиться к запрошенной таблице, представленной как двумерный массив, и получить количество возвращенных строк:
- num_rows() – возвращает количество строк
- empty() – возвращает true, в случае если запрос ничего не вернул, и false, если запрос вернул данные.
Класс SimpleResult: здесь нас может интересовать всего один-единственный метод rows() – он возвращает количество строк, подвергшихся изменению, во время вызова execute(). Данное приложение представляет собой очень простой и детально расписанный пример, который поможет разобраться новичкам:
// пространства имен
#include <mysql++.h>
#include <iostream>
using namespace mysqlpp;
using namespace std;
// создаем экземпляры необходимых объектов
Connection conn;
StoreQueryResult queryres;
string querysring;
int main()
{
try
{
conn.connect("database", "dataserver", "datauser",
"password"); // пробуем подключиться к базе
}
// перехватываем возможное исключение типа ConnectionFailed
catch (ConnectionFailed err)
{
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;
}
}
Как видно, программа очень проста и легка для понимания. Вначале мы пробуем подключится к базе данных database, которая находится на сервере dataserver, как пользователь datauser с паролем password. В случае ошибки перехватываем исключение типа ConnectionFailed, которое имеет метод what(), возвращающий текстовое описание проблемы
После успешного подключения проверяем еще раз, подключены ли мы, т. к. в случае нестабильной связи или по иным причинам соединение может успеть отвалиться. В случае успешной проверки связи инициализируем строку запроса querystring, наш запрос имеет вид: “SELECT * FROM Datatable”, что означает «вернуть абсолютно все записи из некой таблицы Datatable». После этого вызываем метод query класса соединения, и у возвращенного объекта вызываем метод store(), возвращенный результат запроса сохраняем в queryres. Далее проверяем, не пуст ли результат. Если нет – построчно выводим записи на экран.
В классе StoreQueryResult, экземпляром которого является queryres, строки хранятся в виде двумерного ассоциативного массива, это дает возможность обратиться к соответствующему столбцу по его имени. Как в данном случае: queryres[rc][«colname_sec»] – обращаемся к rc-й строке и столбцу под названием colname_one. После окончания работы с БД следует обязательно закрыть соединение, что мы и делаем, вызывая метод disconnect().
В предыдущем примере мы научились получать интересующие нас записи, теперь мы научимся добавлять и удалять их. Я не буду повторять код всей программы, а просто опишу способы, с помощью которых достигается нужный нам результат. В примере ниже показано, как можно добавить строку в нашу таблицу Datatable. SQL запрос в данном случае выглядит как INSERT INTO Datatable(colname_one, colname_sec) VALUES(‘data1?, ‘data2?). А для выполнения этого запроса будем использовать метод execute():
Модификация:
cout << "Изменено строк: " << conn.query(querystring).execute().rows() << endl;
//выполнение запроса с выводом результатаSyhi-подсветка кода
Удаление:
cout << "Удалено строк: " << conn.query(querystring).execute().rows() << endl;
//выполнение запроса с выводом результатаSyhi-подсветка кода
Случается, что запросы могут некорректно работать с кириллическими символами; для устранения этой возмутительной ошибки следует выполнить особый запрос:
conn.query(querystring).execute(); //выполняем запросSyhi-подсветка кода
В данном примере указана кодировка UTF8, как основная на современных Linux системах. Вам следует задать кодировку вашей системы для корректной обработки кириллицы. Для компиляции программы следует выполнить команду:
c++ -o proga -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++ main.cpp
В этой команде файл с исходным кодом main.cpp компилируется, подключая необходимые библиотеки.
Заключение
Выше были описаны примеры, позволяющие взаимодействовать с базой данных MySQL на различных платформах. Были затронуты лишь общие методы работы с библиотекой mysql++, список же классов и их методов намного обширнее; полностью ознакомиться с ними можно на этой странице.
Все упомянутые в статье исходные коды приведены в виде ресурсов в теме «Журнал клуба программистов. Седьмой выпуск» или непосредственно в архиве с журналом.
Ресурсы
- Psycho-coder. Работа с MySQL в C++. – Тема на форуме http://programmersforum.ru/showthread.php?t=59147
- Библиотека MySQL++. Исходный код для самостоятельной компиляции и документация http://tangentsoft.net/mysql++/releases/mysql++-3.0.9.tar.gz
- Бинарная RPM сборка ver1 http://tangentsoft.net/mysql++/releases/mysql++-devel-3.0.9-1.el4.i386.rpm
- Бинарная RPM сборка ver2 http://tangentsoft.net/mysql++/releases/mysql++-devel-3.0.9-1.el3.i386.rpm
- Бинарная RPM сборка ver3 http://tangentsoft.net/mysql++/releases/mysql++-devel-3.0.9-1.el5.i386.rpm
- Бинарная RPM сборка для MS Visual C++ http://tangentsoft.net/mysql++/releases/mysql++-1.7.1-win32-vc++.zip
- Список классов и их методов библиотеки MySQL++ http://tangentsoft.net/mysql++/doc/html/refman/annotated.html
- Полная документация на английском языке с различными примерами http://tangentsoft.net/mysql++/doc/html/userman
Статья из седьмого выпуска журнала «ПРОграммист».
Обсудить на форуме — Работа с MySQL в С++ с использованием библиотеки mysql++
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)