SQLite3 в c ++ выводит пустой список на SELECT - PullRequest
0 голосов
/ 17 октября 2018

Я сейчас работаю на c ++ с SQLite3, все работает нормально, я могу добавить что-то в таблицу, но когда я делаю, 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, и он выводит мне, чтоэто хорошо ..

Если кто-нибудь может мне помочь и объяснить мне, что я сделал не так и как это исправить?Большое спасибо!

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
    ...

1 Ответ

0 голосов
/ 17 октября 2018

Это ... странный ... код (к тому же, как уже упоминалось, на самом деле C ++ недействителен, хотя некоторые компиляторы поддерживают VLA в стиле C в качестве расширения).Обычный рабочий процесс заключается в использовании подготовленного оператора для чего-либо, возвращающего строки или принимающего пользовательские аргументы в форме заполнителей.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);

Больше чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...