首页 > 解决方案 > 使用 C++ 宏封装 SQLITE 错误检查和报告

问题描述

对于每个sqlite3.*API,都可能有一个应检查的错误代码。如果代码对应于错误,则可以通过 检索相关的错误消息sqlite3_errmsg(db)。我正在使用 C++ 宏来包装逻辑以执行调用并将错误打印到标准输出(如果有任何错误)。

但是,以下实现在被调用时打印以下错误消息 SQL_CALL_AND_CHECK(db, std::bind(sqlite3_step, sql_stmt)):“没有更多行可用”。

如果我通过直接调用函数来执行没有宏的 SQLITE 调用,它就可以正常工作。你能帮我调试我的宏并建议一种更简洁的方法来在 C++ 中包装错误处理吗?

#define SQL_CALL_AND_CHECK(db, fn)                                                        \
  if (fn())                                                                               \
  {                                                                                       \
    std::cout << __FILE__ << "@" << __LINE__ << " : " << sqlite3_errmsg(db) << std::endl; \
  }

int main(int argc, char **argv)
{
  sqlite3 *db;
  SQL_CALL_AND_CHECK(db, std::bind(sqlite3_open, "new.db", &db));
  sqlite3_stmt *sql_stmt;
  std::string command = "create table if not exists parking ("
                        "parking_id varchar(20) primary key,"
                        "occupied_status binary,"
                        "vehicle_type varchar(20),"
                        "occupied_at time);";
  SQL_CALL_AND_CHECK(db, std::bind(sqlite3_prepare_v2, db, command.c_str(), -1, &sql_stmt, nullptr));
  SQL_CALL_AND_CHECK(db, std::bind(sqlite3_step, sql_stmt));
  SQL_CALL_AND_CHECK(db, std::bind(sqlite3_finalize, sql_stmt));
  SQL_CALL_AND_CHECK(db, std::bind(sqlite3_close, db));
  return 0;
}

标签: c++csqlite

解决方案


推荐阅读