Как сохранить переменные в C ++ с помощью sqlite3? - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в мире C ++.

Я пытаюсь сохранить в переменную значение, содержащееся в созданной мной таблице sqlite, но я не знаю, как это сделать (я много изучаю, прежде чем спросить здесь).

Итак, после открытия соединения с БД я выполняю это:

   char* sql = new char[4096];
   strcpy(sql, statement.c_str());

   /* Execute SQL statement */
   int rc = sqlite3_exec(DB, sql, callback, 0, &zErrMsg);

   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL ERROR: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "STATEMENT:\n\n%s\n\nEXECUTED SUCCESSFULLY!\n\n", statement.c_str());
   }

И получаю это:

OPENED DATABASE SUCCESSFULLY
sent = 0

sent = 0

sent = 0

sent = 0

sent = 0

sent = 1

sent = 1

sent = 1

STATEMENT:

SELECT sent FROM Message;

EXECUTED SUCCESSFULLY!

Что я хочу сделать, это сохранить значение, содержащееся в «sent» (тип данных в БД - логическое) в переменных типа int, которыми я могу манипулировать, чтобы проверить некоторые условия. Или, может быть, сохранить все значения в массиве int.

Как я могу это сделать? Пожалуйста, помогите мне!

Большое спасибо!

РЕДАКТИРОВАТЬ: я использую библиотеку sqlite3.

И это моя функция обратного вызова:

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Не используйте sqlite3_exec() для чего-либо, что должно что-либо делать с результатами запроса, или для всего, что связано с предоставленными пользователем значениями. Используйте подготовленное утверждение .

Что-то вроде

sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(DB, statement.c_str(), statement.length(), &stmt, nullptr);
if (rc != SQLITE_OK) {
 // handle the error
}
// Loop through the results, a row at a time.
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
 int sent = sqlite3_column_int(stmt, 0);
 // etc.
}
// Free the statement when done.
sqlite3_finalize(stmt);
0 голосов
/ 23 марта 2020

callback - это функция, вызываемая для каждой строки набора результатов. Вы можете присвоить значения массиву или вектору в этой функции. https://www.sqlite.org/c3ref/exec.html

2-й аргумент функции обратного вызова sqlite3_exe c () - это количество столбцов в результате. Третий аргумент обратного вызова sqlite3_exe c () - это массив указателей на строки, полученных как будто из sqlite3_column_text (), по одному для каждого столбца. Если элемент строки результата равен NULL, то соответствующий указатель строки для обратного вызова sqlite3_exe c () является указателем NULL. Четвёртый аргумент обратного вызова sqlite3_exe c () - это массив указателей на строки, где каждая запись представляет имя соответствующего столбца результата, полученного из sqlite3_column_name ().

Вам нужно что-то вроде:

int callback(void *p, int size, char **column_text, char **column_name) {
    if (size == 0) return -1;
    auto &container = *static_cast<std::vector<std::string>*>(p);
    if (!column_text[0]) container.push_back("NULL");
    else container.push_back(column_text[0]);
    return 0;
}

и затем вы можете сохранить значения в вашем контейнере с помощью:

std::vector<std::string> container;
/* Execute SQL statement */
int rc = sqlite3_exec(DB, statement.c_str(), callback, &container, &zErrMsg);

if( rc != SQLITE_OK ){
   fprintf(stderr, "SQL ERROR: %s\n", zErrMsg);
   sqlite3_free(zErrMsg);
} else {
   fprintf(stdout, "STATEMENT:\n\n%s\n\nEXECUTED SUCCESSFULLY!\n\n", statement.c_str());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...