Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpDbErr 615 of 696 menu
◀ ▶

Ошибка SQL-запроса в C++

Синтаксическая ошибка или обращение к несуществующей таблице ломают выполнение SQL.

Движок SQLite не компилирует запросы заранее, поэтому сбой виден только при вызове sqlite3_exec или sqlite3_step. Текст ошибки дает функция sqlite3_errmsg по указателю базы. Неверное имя таблицы в SELECT проверяют отдельно от успешного пути:

#include <iostream> #include <sqlite3.h> int main() { sqlite3* db = nullptr; if (sqlite3_open("bad_sql.db", &db) != SQLITE_OK) { std::cerr << sqlite3_errmsg(db) << "\n"; sqlite3_close(db); return 1; } char* err = nullptr; if (sqlite3_exec( db, "SELECT id FROM missing_table", nullptr, nullptr, &err ) != SQLITE_OK) { std::cout << err << "\n"; sqlite3_free(err); } sqlite3_close(db); return 0; }

Опечатка в ключевом слове тоже возвращает код ошибки. Сообщение можно вывести, не прерывая весь процесс:

#include <iostream> #include <sqlite3.h> int main() { sqlite3* db = nullptr; if (sqlite3_open("bad_sql.db", &db) != SQLITE_OK) { std::cerr << sqlite3_errmsg(db) << "\n"; sqlite3_close(db); return 1; } char* err = nullptr; if (sqlite3_exec( db, "CREATE TABLE IF NOT EXISTS probes (" "id INTEGER PRIMARY KEY" ")", nullptr, nullptr, &err ) != SQLITE_OK) { std::cerr << err << "\n"; sqlite3_free(err); sqlite3_close(db); return 1; } if (sqlite3_exec( db, "INSER INTO probes DEFAULT VALUES", nullptr, nullptr, &err ) != SQLITE_OK) { std::cout << "failed\n"; std::cout << err << "\n"; sqlite3_free(err); } sqlite3_close(db); return 0; }

Откройте safe.db и выполните выборку из ghost_rows. При ошибке выведите "no table".

Создайте таблицу samples и намеренно отправьте запрос с опечаткой в UPDATE. Выведите текст сообщения об ошибке.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить