int sqlite3_get_table( sqlite3 * db,/ *打开的数据库* / const char * zSql,/ *要求值的SQL * / char *** pazResult,/ *查询结果* / int * pnRow,/ *此处写入的结果行数* / int * pnColumn,/ *此处写入的结果列数* / char ** pzErrmsg / *此处写的错误消息* / ); 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()释放结果表。
作为结果表格式的示例,假设查询结果如下:
姓名| 年龄 ----------------------- 爱丽丝| 43 鲍勃| 28岁 辛迪 21岁
有两列(M == 2)和三行(N == 3)。因此,结果表具有8个条目。假设结果表存储在名为azResult的数组中。然后azResult保留以下内容:
azResult [0] =“名称”; azResult [1] =“年龄”; azResult [2] =“爱丽丝”; azResult [3] =“ 43”; azResult [4] =“鲍勃”; azResult [5] =“ 28”; azResult [6] =“辛迪”; 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()的调用中。