When using sqlite3_exec you need to convert all the values from the strings, and you need to use the void * callback pointer or some global variable to return the data:
struct MyData { string A; int B, C; }; int exec_callback(void *ptr, int argc, char *argv[], char *names[]) { vector<MyData> *list = reinterpret_cast<vector<MyData> *>(ptr); MyData d; dA = argv[0] ? argv[0] : ""; dB = atoi(argv[1]); dC = atoi(argv[2]); list->push_back(d); return 0; } void query_with_exec() { vector<MyData> list; char *errmsg = NULL; sqlite3_exec(db, "SELECT a, b, c FROM SQList /* WHERE ... */", exec_callback, &list, &errmsg); if (errmsg) { printf("error: %s!\n", errmsg); return; }
When using sqlite3_prepare* you should call sqlite3_step in a loop until it returns SQLITE_ROW (if you expect only one entry, you can only call it once):
void query_with_step() { vector<MyData> list; sqlite3_stmt *stmt; int rc = sqlite3_prepare_v2(db, "SELECT a, b, c FROM SQList /* WHERE ... */", -1, &stmt, NULL); if (rc != SQLITE_OK) { printf("error: %s!\n", sqlite3_errmsg(db)); return; } for (;;) { rc = sqlite3_step(stmt); if (rc == SQLITE_DONE) break; if (rc != SQLITE_ROW) { printf("error: %s!\n", sqlite3_errmsg(db)); break; } MyData d; const char *text = (const char *)sqlite3_column_text(stmt, 0); dA = text ? text : ""; dB = sqlite3_column_int(stmt, 1); dC = sqlite3_column_int(stmt, 2); list.push_back(d); } sqlite3_finalize(stmt);
source share