c++ и базы данных

21
ИСПОЛЬЗОВАНИЕ БАЗ ДАННЫХ ПРИ РАЗРАБОТКЕ ПРОГРАММ Михаил Кройтор

Upload: mcroitor

Post on 16-Jan-2017

2.967 views

Category:

Education


0 download

TRANSCRIPT

Page 1: C++ и базы данных

ИСПОЛЬЗОВАНИЕ БАЗ ДАННЫХ ПРИ РАЗРАБОТКЕ ПРОГРАМММихаил Кройтор

Page 2: C++ и базы данных

Содержание Управление данными в приложении Встраиваемый сервер баз данных

sqlite Клиент-серверные сервера баз

данных MySQL

Page 3: C++ и базы данных

Управление данными в приложении

Задача любого приложения – обработка данных Создание данных Изменение данных Контроль данных Анализ данных

Хранилища данных Файл Сервер баз данных … Облако …

Page 4: C++ и базы данных

Типы баз данных Встраиваемые

Sqlite, Bekerley DB Клиент-серверные

Oracle, MySQL, MS SQL Server Файл-серверные

Access, FoxPro

Page 5: C++ и базы данных

на примере sqlite

Встраиваемые сервера баз данных

Page 6: C++ и базы данных

Встраиваемый сервер баз данных

СУБД является частью прикладной программы Почтовые клиенты Системы мгновенного обмена

сообщениями Медиапроигрыватели Локальные справочники и т.д.

Физически встраиваемый сервер баз данных является динамической библиотекой SqLite Berkerley DB

Page 7: C++ и базы данных

Встраиваемый сервер баз данных:sqlite

http://sqlite.org Упрощенный синтаксис SQL Используемые типы: INTEGER, REAL,

TEXT, BLOB Является самым распространенным

сервером баз данных в мире (за счет использования в Skype, Firefox, Opera, QT и многих других приложений)

Page 8: C++ и базы данных

Встраиваемый сервер баз данных: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*) – закрытие базы данных

Page 9: C++ и базы данных

Встраиваемый сервер баз данных: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 – сообщение об ошибке

Page 10: C++ и базы данных

Встраиваемый сервер баз данных: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) – разрушение компилируемого запроса

Page 11: C++ и базы данных

Встраиваемый сервер баз данных: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); и другие функции.

Первый параметр – запрос, второй – индекс колонки из таблицы результата.

Page 12: C++ и базы данных

Встраиваемый сервер баз данных: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*); и некоторых других.

Page 13: C++ и базы данных

Встраиваемый сервер баз данных: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;}

Page 14: C++ и базы данных

На примере MySQL

Клиент-серверные базы данных

Page 15: C++ и базы данных

Клиент-серверные сервера баз данных

Большое распространение получили клиент-серверные СУБД за счет централизованной работы множества клиентов с общими данными.

Примеры клиент-серверных СУБД: Oracle MySQL MS SQL Server Interbase и т.д.

Page 16: C++ и базы данных

Клиент-серверные сервера баз данных: MySQL

http://mysql.com Распространяется под 2 лицензиями:

GNU Public License, коммерческая лицензия

Поддерживается Oracle (ранее Sun Microsystems)

Текущая версия 5.6.28 * рекомендую использовать для

разработки библиотеку для языка С, если нет предустановленной boost библиотеки

Page 17: C++ и базы данных

Клиент-серверные сервера баз данных: MySQL

MYSQL – дескриптор соединения к базе. Используется в большинстве функций.

MYSQL_RES – структура, представляющая результат запроса, возвращающего данные (SELECT, SHOW, …).

MYSQL_ROW – строка результата запроса, массив строк.

MYSQL_FIELD – структура, описывающая поле (тип, размер, имя). Значение поля хранится в MYSQL_ROW.

Page 18: C++ и базы данных

Клиент-серверные сервера баз данных: 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); - закрытие соединения

Page 19: C++ и базы данных

Клиент-серверные сервера баз данных: 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); -

возвращает количество столбцов в результате запроса

Page 20: C++ и базы данных

Клиент-серверные сервера баз данных: 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);

Page 21: C++ и базы данных

Клиент-серверные сервера баз данных: 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;}