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

常用方法:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python sql语句生成_python Django 生成sql语句

class TestModel(models.Model):Namemodels.CharField(max_length64,blankTrue)>>> from django.core.management.color import no_style#Style是用来输出语句时着色的>>> from django.db import connection>>> from django.db.backends import cre…

Oozie的架构

Oozie的架构图&#xff0c;如下&#xff1a; 从oozie的架构图中&#xff0c;可以看到所有的任务都是通过oozie生成相应的任务客户端&#xff0c;并通过任务客户端来提交相应的任务。 继续。。。 转载于:https://www.cnblogs.com/zlslch/p/6117705.html

mysql如何做计划任务_简单的mysql 过程计划任务

首先讲讲过程是什么东西, 过程差不多就是SQL用的java之于方法.把一段sql做成过程后一个简单的调用就可以批量执行这些sql,很方便.其实就像java后台写个执行复杂sql的方法,你只是把这段sql存到数据库里了而已.mysql里面有"过程"和"函数"两个概念, 基本上前者…

Linux的#和$区别

【#】代表 root权限【$】代表普通用户 如果更改了/etc/profile , 或~/.bashrc等文档&#xff0c;可以用任何符号来代替它们。 linux窗口下的【rootlocate~】其中的【~】代表代表用户的家目录&#xff08;root为/root&#xff0c;一般user则为/home/username&#xff09;&#x…

python贴吧顶贴_python实现贴吧顶贴机器人

项目目录:– url.txt&#xff1a;多个需要顶起的帖子地址。– reply&#xff1a;多条随机回复的内容。–selenium&#xff1a;浏览器自动化测试框架。首先&#xff0c;我们先使用pip完成selenium的安装。接着&#xff0c;导入pyautogui自动控制鼠标的库。示例代码&#xff1a;p…

Confluence部署攻略 [转]

一、软件介绍 AtlassianConfluence&#xff08;简称Confluence&#xff09;是一个专业的wiki程序。它是一个知识管理的工具&#xff0c;通过它可以实现团队成员之间的协作和知识共享。Confluence不是一个开源软件&#xff0c;非商业用途可以免费使用。 Confluence使用简单&…

对自己的忠告

人生的路上有许许多多的十字路口&#xff0c;迷茫、孤独、失败在所难免&#xff0c;不管自己再怎么改变&#xff0c;也不要忘记那个我。对自己的忠告。 难是多做的理由&#xff0c;而不是不做的理由。当你以为看透事情的本质&#xff0c;或许你只不过是盒子中的盒子。一路上&am…

arp欺骗技术

ARP欺骗技术-获取内网目标IP访问图片!简介&#xff1a;ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个位于TCP/IP协议栈中的网络层&#xff0c;负责将某个IP地址解析成对应的MAC地址。要求&#xff1a; 虚拟机 Kali linux系统 1--命令…

java 读取project_java project 和 java web project 获取路径问题

java project中如何获得相对路径(编译后的目录是在/bin目录下)(一般图片 这些目录放在 项目目录下&#xff0c;与src同级)在static方法中&#xff0c;用String path Test.class.getResource("").getPath();在非static方法中&#xff0c;用String path this.getClas…

前端插件介绍

1.JQuery EasyUI http://www.jeasyui.net/demo/380.html&#xff0c;各种示例代码可以修改使用&#xff0c;简化开发流程。 http://www.jeasyui.net/download/&#xff0c;下载后能查看各种html的源码&#xff0c;引入它的css、js、jquery&#xff0c;然后拿过来demo里的代码就…

java报错 日志_java 日志报错

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.一月 30, 2021 9:13:10 下午 com.github.u…

存储过程实现可扩展灵活接口

序言 本文分享一个通过数据库&#xff08;ORACLE&#xff09;的存储过程&#xff0c;遵循“对修改封闭&#xff0c;对增加开放”的开闭原则&#xff0c;实现的可扩展性极强的灵活接口方案。 背景 本人从事离散型MES系统的开发工作&#xff0c;近期负责了一个PCBA&#xff08;电…

java 缓冲区中的数据存入缓冲区中_java8中NIO缓冲区(Buffer)的数据存储详解|chu...

java8新特性NIO缓冲区(Buffer)的数据存储。ByteBuffer&#xff0c;CharBuffer&#xff0c;ShortBuffer&#xff0c;IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer.1、缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。根据数据类型不同(boole…

mysql 循环体 如何测试_mysql里如何循环插入数据,进行测试

比如从现在开始一直循环到后年&#xff0c;比如设置8根管线&#xff0c;一直循环下去进行数据叠加&#xff0c;下面是C#代码&#xff0c;不知道怎么写下去了private void button1_Click(object sender, EventArgs e){connectionString “SERVER” server “;” “DATABASE”…

mysql的安装备份恢复_安装使用Percona XtraBackup来备份恢复MySQL的教程

1.安装XtraBackupyum的安装方法&#xff1a;自动$ rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm然后会看到&#xff1a;Retrieving http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpmPrepa…

屏幕尺寸

屏幕尺寸分析 <!DOCTYPE html> <script src"js/jquery-1.11.3.js" type"text/javascript"></script> <html> <head><title>aaa</title><style>body{margin:10px;padding:10px;border:10px solid #000;}&l…

java while do_java中while和do-while的总结

主要内容&#xff1a;1、while循环在程序中的应用2、do-while循环在程序中的应用3、循环结构与判断结构相互嵌套----------------------------------------------------------------------------------------------一、while语法&#xff1b;while(循环条件){循环体}代码演示&a…

scrollWidth,clientWidth,offsetWidth的区别

通过一个demo测试这三个属性的差别。 说明&#xff1a; scrollWidth&#xff1a;对象的实际内容的宽度&#xff0c;不包边线宽度&#xff0c;会随对象中内容超过可视区后而变大。 clientWidth&#xff1a;对象内容的可视区的宽度&#xff0c;不包滚动条等边线&#xff0c;会随对…

java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

java 自定义加载器&#xff0c;加载spring包&#xff0c;动态加载实现&#xff0c;jar包隔离&#xff0c;tomcat加载webapp方式发布时间&#xff1a;2018-08-20 12:02,浏览次数&#xff1a;774, 标签&#xff1a;javaspringjartomcatwebapp加载器加载的是配置好classpath路径上…

C#递归、动态规划计算斐波那契数列

//递归public static long recurFib(int num){if (num < 2){return num;}else{return recurFib(num - 1) recurFib(num - 2);}}//动态规划public static long dynFib(int num){int[] nums new int[num];for (int i 0; i < num; i){nums[i] 0;}if (num 1 || num 2){…