如何不在标准输出中写入 sqlite3_exec 的结果

how to write the result of sqlite3_exec not in stdout

我需要执行 sql 命令“select”,return 从它的结果中获取一些数据。我正在尝试使用 sqlite3_exec 来完成它,但它只是在标准输出中写入。我需要做什么才能将数据写入数组或类似的东西?


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;
}

void my_exec(char * sql) {
    sqlite3 *db;
    char *zErrMsg = nullptr;
    int rc;
    //char * sql;

/* Open database */
    rc = sqlite3_open("data_base.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        exit(0);
    } else {
        fprintf(stdout, "Opened database successfully\n");
    }

/* Create SQL statement */
// sql

/* Execute SQL statement */
    rc = sqlite3_exec(db, sql, callback, nullptr, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Success\n");
    }
    /* Close database */
    sqlite3_close(db);
}

再来看sqlite3_exec()的第四个参数。这是传递给回调函数的指针。给 sqlite3_exec() 一个指向您的数据结构的指针,并将结果存储到回调中的该指针。

例如,您可以使用矢量:

std::vector<std::pair<std::string, std::string>> vec;
rc = sqlite3_exec(db, sql, callback, &vec, &zErrMsg);

回调:

static int callback(void *dataPtr, int argc, char **argv, char **azColName){
    auto vec = static_cast<std::vector<std::pair<std::string, std::string>>*>(dataPtr);
    int i;
    for(i=0; i<argc; i++){
        vec->push_back({azColName[i], argv[i] ? argv[i] : "NULL"});
    }
    return 0;
}