常用方法:

1.使用sqlite3_get_table函数

2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段

3.采用配置文件的方式,将所有字段名写入配置文件

方法1:使用sqlite3_get_table函数

代码:

char *dbname = “test.db”;
int rc = sqlite3_open(dbname, &db);
if (rc == SQLITE_OK)
{char sql[256] = “select * from Images” ;char** pResult;int nRow;int nCol;rc = sqlite3_get_table(db, sql, &pResult, &nRow, &nCol, NULL);if (rc == SQLITE_OK){if (nRow >= 1){...}}sqlite3_free_table(pResult);
}
sqlite3_close(db);

分析:

nRow返回的是查询到的记录的行数(不包括字段名那一行),nCol返回的记录的列数,通过pResult可以访问所有返回的数据包括所有的字段名。如下图:

nRow=7,nCol=6,则pResult[0-5]返回的为当前这张表的字段名,每个字段名都是一个字符串数组。

该方法缺点:如果当前表中不存在记录时,将无法访问pResult[0 - nCol-1],这样就无法获取到表中字段。实际应用中经常需要在程序刚启动时就一次性先获取表中所有的字段名以便之后的插入删除更新等操作,所以该方法实用性不强。

方法2:获取sqlite创建表的sql语句字符串

过程分析:sqlite3在创建一个数据库以及对应的表之后会自动生成一个table,该table格式如下:

其中字段sql为创建表的create语句,通过sqlite3_get_table可以获取到指定表的create sql 语句,然后解析字符串就可以得到指定表中所有字段名。

代码:

//获取上图Figures表中create sql语句
string DB_GetFigureCreateSql()
{string res = "";int rc = sqlite3_open(dbname, &db);if (rc == SQLITE_OK){char *sql = "select sql from sqlite_master where tbl_name = 'Figures' and type = 'table'";char** pResult;int nRow;int nCol;rc = sqlite3_get_table(db, sql, &pResult, &nRow, &nCol, NULL);if (rc == SQLITE_OK){if (nRow >= 1){res = pResult[nCol];}}sqlite3_free_table(pResult);}sqlite3_close(db);return res;
}
//解析字符串函数
std::vector<string> split(string str, string separator)
{std::vector<string> result;int cutAt;while ((cutAt = str.find_first_of(separator)) != str.npos){if (cutAt > 0){result.push_back(str.substr(0, cutAt));}str = str.substr(cutAt + 1);}if (str.length() > 0){result.push_back(str);}return result;
}
//获取表中字段名
std::vector<string> DB_GetKeyFieldName(string res)
{std::vector<string> r = split(res, ",");std::vector<string> keyField;for (int i = 0; i < r.size(); ++i){std::vector<string> tp = split(r[i], "\"");if (tp.size() == 2){keyField.push_back(tp[0]);}else if (tp.size() == 3){keyField.push_back(tp[1]);}}return keyField;
}

使用方法

std::vector<string> FieldName = DB_GetKeyFieldName(DB_GetFigureCreateSql());

结果分析:如果表中随时有可能添加新的字段,添加字段的sql语句,如下:

ALTER TABLE x ADD COLUMN "new_col",

其中new_col为字段名,双引号必须加上,因为上面解析的过程以双引号“ \””为分隔字符。(注意:sql语句中加双引号,单引号或者不加引号都可以成功的向指定表中添加字段)

方法3:采用配置文件的方式,将所有字段名写入配置文件

对于某些具体复杂的应用场景,可以采用配置文件的方式将所有字段名写入对应的配置文件中,每次进入应用程序时读取配置文件即可。另外如果某些字段有指定中可选的值,也可以将这些可选值也写入配置文件中。本人自己用的不规范的配置文件写法就不分享了,近期好好研究配置文件的规范写法。

本人暂时只使用过以上三种方法,如果有人任何错误,请及时与我联系。如果有更好的方法,还请留言分享,谢谢!

转载于:https://www.cnblogs.com/battlescars/p/cpp_get_sqlite3_column_name.html

c++获取sqlite3数据库表中所有字段的方法相关推荐

  1. mysql获取两个表中日期字段的最小差值

    一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...

  2. mysql 查找差值最小_mysql获取两个表中日期字段的最小差值

    一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...

  3. 增删改数据库表中的字段名

    1.修改字段名: 修改字段名称用change,后边是新字段+旧字段+类型就可以了 ALTER TABLE grade CHANGE creat_date create_date date; 旧值为cr ...

  4. 操作数据库表中的字段(增加、删除列)

    1.在sqlserver中如何删除某字段: 1) 当字段没有默认值或者约束的时候可以使用: alter table [table_name] drop column [column_name] 来删除 ...

  5. mysql数据库导入到excel表格数据_[转载]将EXCEL表格中的数据导入mysql数据库表中(两种方法)...

    今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...

  6. 把EXCEL表格导入到MYSQL中_将EXCEL表格中的数据导入mysql数据库表中(两种方法)...

    今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...

  7. C#获取SQLServer数据库表名和字段名

    SQLServer数据库每个数据库都有INFORMATION_SCHEMA视图,数据库的结构信息Schema都在这里存储. select TABLE_NAME,TABLE_TYPE,TABLE_CAT ...

  8. java获取插入数据库表中的自增列值的一个简单方法

    PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); // 第一步 ps.execute ...

  9. oracle 字段补充空格,oracle表中某个字段含有字符回车、空格的手动修改方式

    select t.*, t.rowid from TB_SD_STANDARD_CHOOSE_ADVISE t where t.id =323900000 update TB_SD_STANDARD_ ...

最新文章

  1. 没想到租房也要会编程?
  2. kali linux安装搜狗输入法的方法
  3. 天使投资家李镇樟:如何培养世界级企业家
  4. 初探react,用react实现一个todoList功能
  5. 水滴石穿C语言之typedef的问题
  6. 带你掌握不同平台下,探索JDK源码所需的native方法
  7. 详解go语言的array和slice 【一】
  8. html标签--!DOCTYPE (怪异模式和DTD)
  9. 《云云众声》第95期:业界大事接着看 HP成功收购Aruba;IBM战略变动 前景发展被看好...
  10. Wine 开发版 4.6 发布,Windows 应用的兼容层
  11. 中电信推大学生3G上网套餐
  12. 设计模式之备忘录模式(Memento)
  13. 物联网平台Thingsboard接入PM2.5数据实战
  14. 转载Flickr 网站架构分析
  15. 我感觉被骗了,微信内测 “大小号” 功能,同一手机号可注册两个微信
  16. 解决旧笔记本电脑的ME固件的驱动安装程序不支持WIN10安装的方法
  17. CRM为何要给贴标签?
  18. 《项目管理中国式漫画》读后感
  19. 本地服务:无法访问此网站 localhost 拒绝了我们的连接请求。ERR_CONNECTION_REFUSED
  20. java urlrewrite

热门文章

  1. IP通信基础 4月28号
  2. DHCP的4步租约过程
  3. 洛谷 P4016 负载平衡问题 【最小费用最大流】
  4. POJ1459 Power Network —— 最大流
  5. bsgs(Baby Steps Giant Steps)算法
  6. 使用Kotlin开发Android应用 - 环境搭建 (1)
  7. win2003+IIS6+PHP5.3.8+MSSQL2008的安装配置
  8. Extjs4开发中的一些问题
  9. 数据库-存储过程-游标-函数
  10. MongoDB学习笔记(一) MongoDB介绍及安装