函数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
如何将输出保存到变量中?
而不是拥有一个巨大的数组并希望您在调用函数时不会因此而导致堆栈溢出(或者一个小结局最终不够大),最好动态分配正在使用的内存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);
...