小巧。快速。可靠。
三选二。

SQLite C 接口

运行查询的便捷例程

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
void sqlite3_free_table(char **result);

这是一个为了向后兼容而保留的旧接口。不建议使用此接口。

定义:结果表是由 sqlite3_get_table() 接口创建的内存数据结构。结果表记录了一个或多个查询的完整查询结果。

从概念上讲,该表具有一定数量的行和列。但这些数字不是结果表本身的一部分。这些数字是单独获取的。令 N 为行数,M 为列数。

结果表是一个指向以零结尾的 UTF-8 字符串的指针数组。数组中共有 (N+1)*M 个元素。前 M 个指针指向包含列名称的以零结尾的字符串。其余所有条目都指向查询结果。NULL 值导致 NULL 指针。所有其他值都以其 UTF-8 以零结尾的字符串表示形式返回,如 sqlite3_column_text() 所返回。

结果表可能包含一个或多个内存分配。将结果表直接传递给 sqlite3_free() 不安全。应使用 sqlite3_free_table() 释放结果表。

例如,假设查询结果如下所示

Name        | Age
-----------------------
Alice       | 43
Bob         | 28
Cindy       | 21

有两列 (M==2) 和三行 (N==3)。因此结果表有 8 个条目。假设结果表存储在一个名为 azResult 的数组中。那么 azResult 包含以下内容

azResult[0] = "Name";
azResult[1] = "Age";
azResult[2] = "Alice";
azResult[3] = "43";
azResult[4] = "Bob";
azResult[5] = "28";
azResult[6] = "Cindy";
azResult[7] = "21";

sqlite3_get_table() 函数在其第二个参数的以零结尾的 UTF-8 字符串中评估一个或多个用分号分隔的 SQL 语句,并将结果表返回到其第三个参数中给定的指针。

应用程序完成 sqlite3_get_table() 的结果后,必须将结果表指针传递给 sqlite3_free_table() 以释放已分配的内存。由于 sqlite3_malloc() 在 sqlite3_get_table() 中发生的方式,因此调用函数不得尝试直接调用 sqlite3_free()。只有 sqlite3_free_table() 才能正确安全地释放内存。

sqlite3_get_table() 接口作为 sqlite3_exec() 的包装器实现。sqlite3_get_table() 例程无法访问 SQLite 的任何内部数据结构。它仅使用此处定义的公共接口。因此,包装层中内部 sqlite3_exec() 调用之外发生的错误不会反映在随后对 sqlite3_errcode()sqlite3_errmsg() 的调用中。

另请参阅 对象常量函数 列表。