常用方法:

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[] = “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 >= ){
...
}
}
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 >= )
{
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 > )
{
result.push_back(str.substr(, cutAt));
}
str = str.substr(cutAt + );
}
if (str.length() > )
{
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 = ; i < r.size(); ++i)
{
std::vector<string> tp = split(r[i], "\"");
if (tp.size() == )
{
keyField.push_back(tp[]);
}
else if (tp.size() == )
{
keyField.push_back(tp[]);
}
}
return keyField;
}

使用方法

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

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

ALTER TABLE x ADD COLUMN "new_col",

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

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

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

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

c++获取sqlite3数据库表中所有字段的方法的更多相关文章

  1. 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件

    本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...

  2. 将文件导入到SQL server数据库表中的字段中

    一.在要执行的sql server数据库a中执行如下脚本,创建存储过程sp_textcopy /* 将二进制文件导入.导出到数据库相应字段列中 */ CREATE PROCEDURE sp_textc ...

  3. oracle 中查看数据库表中某个字段是否重复

    1.select  表中重复的字段 from  表名 group by 表中的重复的字段 HAVING count(表中的重复的字段)>1 举例说明 : 表名 : psp_cell_model  ...

  4. 往sql数据库表中添加字段

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数增加字段: alter table [表名] add 字段名 smallin ...

  5. java如何获得数据库表中各字段的字段名

    public class TestDemo { public static Connection getConnection() { Connection conn = null; try { Cla ...

  6. mysql数据库表中判断字段是否存在,如果不存在则创建该字段

    $key_answer = 'answer'.$question_num; $test_question = mysql_query('DESCRIBE question_manage {$key_q ...

  7. 用dataset做数据源时,让gridview显示的列名与数据库表中的字段名不同

    原文发布时间为:2008-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 确定GridView的AutoGenerateColumns设置为False;使用GridView的“编辑列”,添 ...

  8. FineUI之使用SQL脚本从数据库表中生成对应的输入控件

    在WEB开发时.常常须要根据数据库表中的字段建立对应的输入控件,来获取输入的数据.每次都须要按字段来敲,显然太低效.并且easy出错.这里提供一个SQL脚本生成对应输入控件的方法. USE DBDem ...

  9. C# 获取SqLite数据库表信息以及获取表内字段信息

    #region 最新数据表信息显示事件 /// <summary> /// 最新数据表信息显示事件 /// </summary> /// <param name=&quo ...

随机推荐

  1. Hadoop Pipes Exception: Illegal text protocol command

    Hadoop Pipes Exception: Illegal text protocol command 对于Hadoop pipes 出现这样的错误,基本上编译代码依赖的.so和.a 版本不匹配 ...

  2. SpringMvc+Mybatis 框架搭建

    本文承接上一篇[idea使用maven搭建springmvc] 开篇:在main/resources下新建dbconfig.properties.spring.xml.spring-mybatis.x ...

  3. ugui 获取Text的高度,动态改变高度

    项目中需要根据聊天内容的多少.显示外边框的高度.因为Text的内容是不固定的.但宽度是固定的.高度根据文字多少自增 可以通过Text的属性preferredHeight 获取文本框的高度

  4. httpclient 认证方式访问http api/resutful api并获取json结果

    最近,因公司线上环境rabbitmq经常发生堆积严重的现象,于是跟运维组讨论,帮助开发个集中监控所有rabbitmq服务器运行情况的应用,需要通过java访问rabbitmq暴露的http api并接 ...

  5. CRM 2013 系统设置新功能二:Entity images 图像字段

    CRM2013系统默认的许多实体都已经有了图像的选择,如 右上角可以设置当前用户的头像. 客户.联系人等都可以,下面将介绍一下此项新功能: 一.实体中新建图像字段,其中系统自动命名entityinag ...

  6. RecyclerView添加头部和底部视图的实现

    ListView是有addHeaderView和 addFooterView两个方法的. 但是作为官方推荐的ListView的升级版RecyclerView缺无法实现这两个方法. 那么如果使用Recy ...

  7. iOS 获取UIView所在的VIewController

    写程序的时候我们经常要封装代码,当你封装了一个UIView的子类里需要调用所在ViewController的方法用如下代码调取所在的VIewController #pragma mark - 获取所在 ...

  8. java多线程系列8-线程的优先级

    在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...

  9. IOS客户端Coding项目记录(五)

    1:统一修改导航栏的样式,在 AppDelegate.m中 - (BOOL)application:(UIApplication *)application didFinishLaunchingWit ...

  10. iOS第三方类库JSPatch(热更新)

    ---------------------------------------------------------------------------------------------------- ...