SQLite3 在 c++ 中输出 SELECT 上的空列表

SQLite3 in c++ outputing empty list on SELECT

本文关键字:列表 SELECT 输出 c++ SQLite3      更新时间:2023-10-16

我目前正在使用 SQLite3 处理 c++,一切正常,我可以在表中添加东西,但是当我做一个SELECT * FROM myTable;时,它会返回我(null)...... 变量rc

sqlite3 *db;
char *zErrMsg;
int rc;
std::string sql = "SELECT * FROM users;";
char csql[sql.size()+1];
strcpy(csql, csql.c_str()); // String to char*
rc = sqlite3_exec(db, csql, callback, 0, &zErrMsg); // rc = 21 Error
...

是21..根据 https://www.sqlite.org/c3ref/c_abort.html,这意味着我"错误地使用了库"。然后我用python和在线sql检查了同一个.db文件,它输出了我什么是好的。

如果有人可以帮助我并解释我做错了什么以及如何纠正它? 谢谢!

附言: 这是我的函数 addUser,以防问题出在 add..

bool addUser(std::string username, std::string password){
char cpassword[password.size()+1];
strcpy(cpassword, password.c_str());
std::string shashedP = hashPass(cpassword); // hashPass returns std::string
std::string sql = "INSERT INTO users (username, passw) VALUES ('" + username  + "', " + shashedP + ");";
char csql[sql.size()+1];
strcpy(csql, sql.c_str());
rc = sqlite3_exec(db, csql, callback, 0, &zErrMsg); // rc = SQLITE3_OK = 0 everytime
...

那是...奇怪。。。代码(另外,如前所述,C++不是真正有效的,尽管一些编译器确实支持 C 样式的 VLA 作为扩展(。正常的工作流是对任何返回行的内容使用预准备语句,或者以占位符的形式获取用户提供的参数。sqlite3_exec()通常只适用于创建表,以及没有结果且没有运行时定义的参数传递给查询的情况。

例如:

std::string query = "SELECT foo FROM bar WHERE name = ?";
std::string name = "Bob";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, query.c_str(), query.size(), &stmt, nullptr) != SQLITE_OK) {
// Error reporting and handling
}
sqlite3_bind_text(stmt, 1, name.c_str(), name.size(), SQLITE_STATIC);
while (sqlite3_step(stmt) == SQLITE_ROW) {
int foo = sqlite3_column_int(stmt, 0);
// Do stuff with the current row's foo
}
sqlite3_finalize(stmt);

更多阅读。