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 指针。所有其他值均采用sqlite3_column_text()返回的 UTF-8 零终止字符串表示形式。
结果表可能包含一个或多个内存分配。将结果表直接传递给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()的后续调用中。