有据可查,您可以使用 C 中的
callback()
函数以如下格式迭代打印 SQLite 表列名称和值:
ID = 1
COLUMN_A = <value>
COLUMN_B = <value>
ID = 2
COLUMN_A = <value>
COLUMN _B = <value>
但是,这种格式占用了不必要的垂直空间,并且不保留表格的视觉结构。有没有一种简单、直接的方法可以在 C 中打印 SQLite 表并保留表结构?
我曾经用 C++ 玩过 sqlite 并创建了一个小计算器应用程序,它将变量保存在数据库中。我使用他们的quickstart示例作为参考。我使用了有点类似的方法来打印数据。
我用
+
、-
和 |
符号打印一些行,使其看起来像一个真实的表格,即使在使用 ascii 的简单终端上打印时也是如此。
打印格式良好的表格的重要部分是那些行/分隔符,为此您需要能够检查您是否位于第一行。为此,我使用
void*
函数的 callback
参数。这还允许我返回表中的列数,以便我也可以在末尾打印分隔符。
struct TableData {
int currentRow;
int columns;
int columnWidth;
};
void printTableSeparator(const int columns, const int width) {
for (int i = 0; i < columns; ++i) {
printf("+");
for (int j = 0; j < width; ++j) {
printf("-");
}
}
printf("+\n");
}
void printTableRow(const int columns, const int width, const char** itemNames) {
for (int i = 0; i < columns; ++i) {
printf("|%-*.*s", width, width, itemNames[i]);
}
printf("|\n");
}
int callback(void* data, int argc, char** argv, char** azColName) {
struct TableData* table = data;
if (table->currentRow == 0) {
table->columns = argc;
printTableSeparator(argc, table->columnWidth);
printTableRow(argc, table->columnWidth, azColName);
printTableSeparator(argc, table->columnWidth);
}
printTableRow(argc, table->columnWidth, argv);
table->currentRow++;
return 0;
}
int exec_wrapper(sqlite3* db, const char* sql, char** errmsg) {
struct TableData table = { 0 };
table.columnWidth = 15;
int ret = sqlite3_exec(db, sql, callback, &table, errmsg);
printTableSeparator(table.columns, table.columnWidth);
return ret;
}
在数据库中的一组变量表上执行此操作会得到以下结果:
+---------------+---------------+
|name |value |
+---------------+---------------+
|pi |3.14159 |
|e |2.71828 |
|g |9.80665 |
|ans |8.0 |
|area |138.23 |
|var |6.40318 |
+---------------+---------------+