- Знакомство с принципами работы с базой данных в MQL5
- Основы SQL
- Структура (схема) таблиц: типы данных и ограничения
- Интеграция ООП (MQL5) и SQL: концепция ORM
- Создание, открытие и закрытие базы данных
- Выполнение запросов без привязки к данным MQL5
- Проверка существования таблицы в базе данных
- Подготовка запросов с привязкой: DatabasePrepare
- Удаление и сброс подготовленных запросов
- Привязка данных к параметрам запроса:DatabaseBind/Array
- Выполнение подготовленных запросов: DatabaseRead/Bind
- Раздельное чтение полей: DatabaseColumn-функции
- Примеры CRUD-операций в SQLite через объекты ORM
- Транзакции
- Импорт и экспорт таблицы базы данных
- Печать таблиц и SQL-запросов в журнал
- Пример поиска торговой стратегии средствами SQLite
Проверка существования таблицы в базе данных
Встроенная функция DatabaseTableExists позволяет проверить наличие таблицы по её имени.
bool DatabaseTableExists(int database, const string table)
Дескриптор базы и имя таблицы задаются в параметрах.
Результат вызова функции равен true, если таблица существует.
Дополним класс DBSQLite соответствующим методом hasTable.
class DBSQLite
|
В скрипте DBcreateTable.mq5 убедимся в появлении таблицы.
void OnStart()
|
Опять же, не смущаемся потенциальной возможности получить ошибку при попытке повторного создания. Это никак не влияет на наличие таблицы.
database error, table table1 already exists
|
Поскольку мы пишем универсальный вспомогательный класс DBSQLite, предусмотрим в нем механизм удаления таблиц. Напомним, что в SQL для этой цели есть команда DROP.
class DBSQLite
|
Перед выполнением запроса мы проверяем наличие таблицы и сразу выходим, если её нет.
После выполнения запроса мы дополнительно проверяем, удалилась ли таблица, повторным вызовом DatabaseTableExists. Поскольку отсутствие таблицы будет помечено кодом ошибки DATABASE_NO_MORE_DATA, а для данного метода это ожидаемый результат, мы очищаем код ошибки с помощью ResetLastErrorOnCondition.
В принципе, более эффективно использовать возможности самого SQL для исключения попытки удаления несуществующей таблицы: достаточно добавить в запрос фразу "IF EXISTS". Поэтому окончательный вариант метода deleteTable упрощается:
bool deleteTable(const string name) const
|
Вы можете попробовать написать проверочный скрипт для удаления таблицы самостоятельно, но будьте осторожны, чтобы в зависимости от входных переменных по ошибке не удалить какую-нибудь рабочую таблицу. Таблицы удаляются сразу со всеми данными, без запросов подтверждения и без возможности восстановления. Для важных проектов сохраняйте бэкапы баз.