sqlite3 读取表数据

本文详细解析SQLITE_API中的sqlite3_get_table函数,通过实例演示如何使用该函数高效读取数据库表数据,并解释其参数含义及内存布局,提供更清晰的理解路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上一段 sample
 
#include <stdio.h>
#include <string.h>
#include "sqlite3.h"

int main()
{
	sqlite3 *db;
	char *zErrMsg = 0;
	int rc;
	char **result;
	int row, column;
	int i, j;
	
	rc = sqlite3_open("gt_db.db", &db);
	if( rc ){
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return -1;
	}	


	rc = sqlite3_get_table(db, "SELECT * FROM DeviceMap", &result, &row, &column, &zErrMsg);

	if (rc == SQLITE_OK) {
		printf("row = %d, column = %d\n", row, column);
		printf(result[0]);
		for (i = 0; i <= row; i++) {
			printf("----------- %d -------------\n", i);
			for (j = 0; j < column; j++) {
				printf("%s  ",  result[i*column + j]);
			}
		}
	}
	
	sqlite3_free_table(result);


	sqlite3_close(db);

	return 0;
}


其实,读取表数据只要用 sqlite3_get_table 就可以了,当然,也可以用 sqlite3_exec 然后在回调里查。

官方的说明,讲了一大堆,还举了实例,就怕你看不懂,结果还真是越讲越糊涂了。

SQLITE_API 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 */
);


其实是要注意结构就明白了,举个例子

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


这个数据表里,有两个字段 Name    和 Age,   那在一段内存里怎么表示呢?

其实就是用二维数组。

pnRow ---   表示有几条记录;

pnColumn -- 表示有几个内容,即有几个字段;

 

那在上面这个示例中

 pnRow = 3,    pnColumn = 2

 

如果我要取 Bob 这个人的记录,则

(*pazResult)[pnColumn * 2 + 0]   取出名字  bob

(*pazResult)[pnColumn * 2 + 1]   取出年龄

 

这样会不会比 sqlite3_exec 方便呢?

当然,查完之后,要用 sqlite3_free_table(result);  释放掉占用的内存

 

 

### C++ 中使用 SQLite3 获取列数 为了在 C++ 中通过 SQLite3 库获取特定的列数,可以执行 SQL 查询来检索该信息。具体来说,可以通过查询 `PRAGMA table_info` 或者直接解析 `sqlite_master` 中的数据结构。 #### 方法一: 使用 PRAGMA 命令 这是最简便的方式之一,因为不需要手动解析字段定义: ```cpp #include <iostream> #include <sqlite3.h> void get_column_count(const char* db_name, const char* table_name){ sqlite3* DB; if (sqlite3_open(db_name, &DB)) { std::cerr << "Can&#39;t open database: " << sqlite3_errmsg(DB) << "\n"; return ; } sqlite3_stmt* stmt; // Prepare the statement with a query that uses pragma to fetch column info. if (sqlite3_prepare_v2(DB, ("PRAGMA table_info(" + std::string(table_name) + ");").c_str(), -1, &stmt, nullptr ) != SQLITE_OK ) { std::cout << "Failed to prepare statement\n"; sqlite3_close(DB); return ; } int count = 0; while (sqlite3_step(stmt) == SQLITE_ROW){ ++count; } std::cout << "Table ["<< table_name << "] has " << count << " columns.\n"; // Finalize and close resources properly after use. sqlite3_finalize(stmt)[^1]; sqlite3_close(DB); } ``` 此方法利用了SQLite内置的元命令功能,即 `PRAGMA table_info()` 函数返回有关指定格的信息列,每一行代一个单独的列描述符。因此只需遍历结果集并计数即可得到总共有多少个条目。 #### 方法二: 解析 CREATE TABLE 语句 另一种方式是从 `sqlite_master` 读取创建时使用的原始SQL语句,并从中提取出列的数量。这种方式较为复杂,通常不推荐用于简单的应用场合。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值