- Знакомство с принципами работы с базой данных в MQL5
- Основы SQL
- Структура (схема) таблиц: типы данных и ограничения
- Интеграция ООП (MQL5) и SQL: концепция ORM
- Создание, открытие и закрытие базы данных
- Выполнение запросов без привязки к данным MQL5
- Проверка существования таблицы в базе данных
- Подготовка запросов с привязкой: DatabasePrepare
- Удаление и сброс подготовленных запросов
- Привязка данных к параметрам запроса:DatabaseBind/Array
- Выполнение подготовленных запросов: DatabaseRead/Bind
- Раздельное чтение полей: DatabaseColumn-функции
- Примеры CRUD-операций в SQLite через объекты ORM
- Транзакции
- Импорт и экспорт таблицы базы данных
- Печать таблиц и SQL-запросов в журнал
- Пример поиска торговой стратегии средствами SQLite
Раздельное чтение полей: DatabaseColumn-функции
В результате выполнения запроса функциями DatabaseRead или DatabaseReadBind программа получает возможность пролистывать записи, отобранные по заданным условиям. На каждой итерации во внутренних структурах "движка" SQLite выделена одна конкретная запись, поля (столбцы) которой доступны через группу DatabaseColumn-функций.
int DatabaseColumnsCount(int request)
По дескриптору запроса функция возвращает количество полей (столбцов) в результатах запроса.
В случае ошибки получим -1.
Узнать количество полей запроса, созданного в DatabasePrepare, можно еще до вызова функции DatabaseRead. Для остальных DatabaseColumn-функций предварительно требуется вызвать DatabaseRead (хотя бы один раз).
Для каждого поля в результатах запроса программа может по его порядковому номеру узнать название (DatabaseColumnName), тип (DatabaseColumnType), размер (DatabaseColumnSize), а также значение соответствующего типа (под каждый тип выделена своя функция).
bool DatabaseColumnName(int request, int column, string &name)
Функция заполняет переданный по ссылке строковый параметр (name) названием указанного по номеру столбца (column) в результатах запроса (request).
Нумерация полей начинается с 0 и не может превышать значение DatabaseColumnsCount() - 1. Это касается не только данной, но и всех остальных функций раздела.
Функция возвращает true в случае успеха или false в случае ошибки.
ENUM_DATABASE_FIELD_TYPE DatabaseColumnType(int request, int column)
Функция DatabaseColumnType возвращает тип значения в указанном столбце в текущей записи результатов запроса. Возможные типы собраны в перечислении ENUM_DATABASE_FIELD_TYPE.
Идентификатор |
Описание |
---|---|
DATABASE_FIELD_TYPE_INVALID |
Ошибка получения типа, код ошибки в _LastError |
DATABASE_FIELD_TYPE_INTEGER |
Целое число |
DATABASE_FIELD_TYPE_FLOAT |
Вещественное число |
DATABASE_FIELD_TYPE_TEXT |
Строка |
DATABASE_FIELD_TYPE_BLOB |
Двоичные данные |
DATABASE_FIELD_TYPE_NULL |
Пустота (специальный тип NULL) |
Более подробно про типы SQL и их соответствие типам MQL5 было рассказано в разделе Структура (схема) таблицы: типы данных и ограничения.
int DatabaseColumnSize(int request, int column)
Функция возвращает размер значения в байтах для поля под индексом column в текущей записи результатов запроса request. Например, целочисленные значения могут быть представлены различным количеством байтов (мы это знаем и по типам MQL5, в частности, short/int/long).
Следующая группа функций позволяет получить само значение конкретного типа из соответствующего поля записи. Для чтения значений из следующей записи нужно снова вызвать DatabaseRead.
bool DatabaseColumnText(int request, int column, string &value)
bool DatabaseColumnInteger(int request, int column, int &value)
bool DatabaseColumnLong(int request, int column, long &value)
bool DatabaseColumnDouble(int request, int column, double &value)
bool DatabaseColumnBlob(int request, int column, void &data[])
Все функции при успешном выполнении возвращают true и помещают значение поля в приемную переменную value. Особый случай представляет только функция DatabaseColumnBlob, которой в качестве выходной переменной передается массив произвольного простого типа или простых структур. Указав массив uchar[], как наиболее универсальный вариант, вы можете прочитать байтовое представление любого значения (включая двоичные файлы, помечаемые типом DATABASE_FIELD_TYPE_BLOB).
Движок SQLite не проверяет, чтобы для столбца вызывалась функция, соответствующая его типу. Если типы по недосмотру или намеренно отличаются, система автоматически неявным образом сконвертирует значение поля под тип приемной переменной.
Теперь, после знакомства с большинством Database-функций, мы можем завершить разработку набора SQL-классов в файле DBSQLite.mqh и обратиться к практическим примерам.