如何在C中以表格格式打印SQLite表

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

有据可查,您可以使用 C 中的

callback()
函数以如下格式迭代打印 SQLite 表列名称和值:

ID = 1
COLUMN_A = <value>
COLUMN_B = <value>

ID = 2
COLUMN_A = <value>
COLUMN _B = <value>

但是,这种格式占用了不必要的垂直空间,并且不保留表格的视觉结构。有没有一种简单、直接的方法可以在 C 中打印 SQLite 表并保留表结构?

c sqlite
1个回答
0
投票

我曾经用 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        |
+---------------+---------------+
© www.soinside.com 2019 - 2024. All rights reserved.