Ошибка 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.
Выведите текст сообщения об ошибке.