Раздельное чтение полей: 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 и обратиться к практическим примерам.