c++ - 使用 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;
}