我目前正在使用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,这表示我“错误地使用了库”。.然后,我在同一.db
文件中使用python和联机sql检查了该文件,并输出了我所需要的信息。 ..
如果有人可以帮助我并向我解释我做错了什么以及如何纠正它? 非常感谢你!
ps: 这是我的函数addUser,以防问题出在添加中。
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
...
答案 0 :(得分:0)
那是...奇怪的代码(如前所述,并不是真正有效的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);