c++ и базы данных
Post on 16-Jan-2017
2.967 Views
Preview:
TRANSCRIPT
ИСПОЛЬЗОВАНИЕ БАЗ ДАННЫХ ПРИ РАЗРАБОТКЕ ПРОГРАМММихаил Кройтор
Содержание Управление данными в приложении Встраиваемый сервер баз данных
sqlite Клиент-серверные сервера баз
данных MySQL
Управление данными в приложении
Задача любого приложения – обработка данных Создание данных Изменение данных Контроль данных Анализ данных
Хранилища данных Файл Сервер баз данных … Облако …
Типы баз данных Встраиваемые
Sqlite, Bekerley DB Клиент-серверные
Oracle, MySQL, MS SQL Server Файл-серверные
Access, FoxPro
на примере sqlite
Встраиваемые сервера баз данных
Встраиваемый сервер баз данных
СУБД является частью прикладной программы Почтовые клиенты Системы мгновенного обмена
сообщениями Медиапроигрыватели Локальные справочники и т.д.
Физически встраиваемый сервер баз данных является динамической библиотекой SqLite Berkerley DB
Встраиваемый сервер баз данных:sqlite
http://sqlite.org Упрощенный синтаксис SQL Используемые типы: INTEGER, REAL,
TEXT, BLOB Является самым распространенным
сервером баз данных в мире (за счет использования в Skype, Firefox, Opera, QT и многих других приложений)
Встраиваемый сервер баз данных:sqlite
struct sqlite3 – структура, описывающая базу данных
int sqlite3_open(const char *filename, sqlite3 **ppDb) – открытие базы данных
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) – выполнение запроса к базе данных
int sqlite3_close(sqlite3*) – закрытие базы данных
Встраиваемый сервер баз данных:sqlite int sqlite3_exec(sqlite3* db, const char *sql,
sqlite_callback* cb, void *data, char **errmsg); db – ссылка на базу данных sql – sql-запрос cb – функция обработки результата запроса. Имеет
сигнатуру int (*callback)(void* p, int argc, char** argv, char**
num_cols); data – данные, передаваемые в функцию обработки
результата запроса через 1-ый параметр errmsg – сообщение об ошибке
Встраиваемый сервер баз данных:sqlite, компилируемые запросы struct sqlite3_stmt - структура для хранения
компилируемого запроса int sqlite3_prepare_v2( sqlite3 *db, const char
*zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail) - подготовка компилируемого запроса
int sqlite3_step(sqlite3_stmt*) – выполнение запроса
int sqlite3_reset(sqlite3_stmt *pStmt) – сброс запроса
int sqlite3_finalize(sqlite3_stmt *pStmt) – разрушение компилируемого запроса
Встраиваемый сервер баз данных:sqlite, компилируемые запросы Обработка результата компилируемого запроса:
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); double sqlite3_column_double(sqlite3_stmt*, int iCol); int sqlite3_column_int(sqlite3_stmt*, int iCol); const unsigned char *sqlite3_column_text(sqlite3_stmt*,
int iCol); sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int
iCol); и другие функции.
Первый параметр – запрос, второй – индекс колонки из таблицы результата.
Встраиваемый сервер баз данных:sqlite, компилируемые запросы Результат компилируемого запроса можно связывать
с переменными при помощи следующих функций: int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n,
void(*)(void*)); int sqlite3_bind_double(sqlite3_stmt*, int, double); int sqlite3_bind_int(sqlite3_stmt*, int, int); int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); int sqlite3_bind_null(sqlite3_stmt*, int); int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int,
void(*)(void*)); int sqlite3_bind_value(sqlite3_stmt*, int, const
sqlite3_value*); и некоторых других.
Встраиваемый сервер баз данных:sqlite, пример#include <sqlite3.h>#include <iostream>
const char* query = "SELECT * FROM example";
int main(int argc, char** argv) { sqlite3* db; sqlite3_stmt* stmt; int result = sqlite3_open("database.sqlite", &db); sqlite3_prepare_v2(db, query, 255, &stmt, NULL); result = sqlite3_step(stmt); if(result == SQLITE_ROW){ std::cout << sqlite3_column_int(stmt, 0) << " " << sqlite3_column_text(stmt, 1) << " " << sqlite3_column_text(stmt, 2) << std::endl; } else{ std::cout << "no result" << std::endl; } sqlite3_finalize(stmt); sqlite3_close(db); return 0;}
На примере MySQL
Клиент-серверные базы данных
Клиент-серверные сервера баз данных
Большое распространение получили клиент-серверные СУБД за счет централизованной работы множества клиентов с общими данными.
Примеры клиент-серверных СУБД: Oracle MySQL MS SQL Server Interbase и т.д.
Клиент-серверные сервера баз данных: MySQL
http://mysql.com Распространяется под 2 лицензиями:
GNU Public License, коммерческая лицензия
Поддерживается Oracle (ранее Sun Microsystems)
Текущая версия 5.6.28 * рекомендую использовать для
разработки библиотеку для языка С, если нет предустановленной boost библиотеки
Клиент-серверные сервера баз данных: MySQL
MYSQL – дескриптор соединения к базе. Используется в большинстве функций.
MYSQL_RES – структура, представляющая результат запроса, возвращающего данные (SELECT, SHOW, …).
MYSQL_ROW – строка результата запроса, массив строк.
MYSQL_FIELD – структура, описывающая поле (тип, размер, имя). Значение поля хранится в MYSQL_ROW.
Клиент-серверные сервера баз данных: MySQL MYSQL *mysql_init(MYSQL *mysql); - инициализация
дескриптора соединения MYSQL *mysql_real_connect(MYSQL *mysql, const char
*host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag); - подключение к базе данных
const char *mysql_error(MYSQL *mysql); - информация об ошибке
unsigned int mysql_field_count(MYSQL *mysql); - возвращает количество столбцов результата
void mysql_free_result(MYSQL_RES *result); - очистка (освобождение памяти) структуры результата
void mysql_close(MYSQL *mysql); - закрытие соединения
Клиент-серверные сервера баз данных: MySQL int mysql_query(MYSQL *mysql, const char *stmt_str); -
выполнение запроса my_ulonglong mysql_affected_rows(MYSQL *mysql); -
возвращает количество измененных запросом строк MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); -
получение информации о столбце MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); -
извлечение следующей строки из результата unsigned int mysql_field_count(MYSQL *mysql); -
возвращает количество столбцов результата my_ulonglong mysql_num_rows(MYSQL_RES *result); -
возвращает количество столбцов в результате запроса
Клиент-серверные сервера баз данных: MySQL пример#include <mysql.h>#include <iostream>
const char* host = "localhost";const char* dbuser = "root";const char* dbpwd = "";const char* dbname = "moodle";const int dbport = 3306;
const char* query = "SELECT username, password FROM mdl_user";
int main(int argc, char** argv) { MYSQL mysql, *connector; MYSQL_RES* result; MYSQL_ROW row; int query_result; mysql_init(&mysql); connector = mysql_real_connect(
&mysql, host, dbuser, dbpwd, dbname, dbport, 0, 0);
Клиент-серверные сервера баз данных: MySQL пример (продолжение) if(connector == NULL){ std::cout << "mysql connection error: " << mysql_error(&mysql) << std::endl; return 1; } std::cout << "connected successfully!" << std::endl; query_result = mysql_query(connector, query); if(query_result == 0){ result = mysql_store_result(connector); while((row = mysql_fetch_row(result)) != 0){ std::cout << row[0] << " " << row[1] << std::endl; } mysql_free_result(result); } else{ std::cout << "mysql selection error: " << mysql_error(connector); } mysql_close(connector); return 0;}
top related