SQLite C API如何将查询输出保存为字符串

问题描述 投票:3回答:1

函数showGenres运行选择查询,以将SQL表类型的内容打印到控制台。我想将该结果从SELECT * FROM genres查询保存到我的char genresDisplay[1000]变量中。

我曾尝试使用strcat将sqlite3_column_text(statement, 0)连接到变量,然后打印该变量,但这没有用。我也尝试过sprintf(),但那也不起作用。

void showGenres()
{
    int genre_count = 0;
    char genresDisplay[100000];
    char genreID[1000], genreName[1000], genreDescription[1000];

    rc = sqlite3_open("topmusic.db", &database);
    if (rc)
        printf("Error opening database. \n");
    else
        printf("Database opened successfully. \n");
    asprintf(&query, "SELECT * FROM genres;");
    printf("The following SQL Query will run: '%s'\n", query);
    if (sqlite3_prepare_v2(database, query, strlen(query), &statement, NULL) != SQLITE_OK)
    {
        sqlite3_close(database);
        printf("Can't retrieve data: %s\n", sqlite3_errmsg(database));
    }
    printf("%16s | %32s | %48s\n", "ID", "Genre", "Description");
    while (sqlite3_step(statement) == SQLITE_ROW)
    {
         printf("%16s | %32s | %48s\n",
               sqlite3_column_text(statement, 0),
               sqlite3_column_text(statement, 1),
               sqlite3_column_text(statement, 2));
        genre_count++;
    }
    printf("Number of genres: %d\n", genre_count);
    sqlite3_finalize(statement);
    free(query);
    sqlite3_close(database);
}

此功能将向控制台输出以下内容:

Database opened successfully. 
The following SQL Query will run: 'SELECT * FROM genres;'
              ID |                            Genre |                                      Description
               1 |                              pop |                                           (null)
               2 |                             rock |                                           (null)
               3 |                            blues |                                           (null)
               4 |                        classical |                                           (null)
               5 |                            dance |                                           (null)
               6 |                        hard rock |                                                 
               7 |                            metal |                                   No description
               8 |                      heavy metal |                                    a description
               9 |                             test |                                   No description
              10 |                         pop rock |                                   No description
              11 |                             exit |                                   No description
              12 |                            test2 |                                   No description
              13 |                            test3 |                                   No description
              14 |                            test4 |                                   No description
              15 |                        asdasdasd |                                   No description
Number of genres: 15

如何将输出保存到变量中?

c sqlite
1个回答
0
投票

而不是拥有一个巨大的数组并希望您在调用函数时不会因此而导致堆栈溢出(或者一个小结局最终不够大),最好动态分配正在使用的内存malloc(),然后根据需要使用realloc()进行扩展,以保留所有结果。但是,这很乏味且容易出错。幸运的是,Sqlite提供了some functions来为您管理动态增长的字符串缓冲区。

使用该API,您的代码可能看起来像

...
sqlite3_str *buffer = sqlite3_str_new(database);
while (sqlite3_step(statement) == SQLITE_ROW)
{
    sqlite3_str_appendf(buffer, "%16s | %32s | %48s\n",
                        (const char *)sqlite3_column_text(statement, 0),
                        (const char *)sqlite3_column_text(statement, 1),
                        (const char *)sqlite3_column_text(statement, 2));
    genre_count++;
}
// Don't forget to free genreDisplay with sqlite3_free() when done.
char *genreDisplay = sqlite3_str_finish(buffer);
...
© www.soinside.com 2019 - 2024. All rights reserved.