SQLite数据库使用(sqlite3 c++)
本文只针对sqlite3 c++ API调用。
1、基础知识
sqlite3只是一个嵌入式数据库引擎,占用资源非常底,可以适用于Windows和Linux,而且sqlite3只是一个文件,不需要服务器进程。
sqlite3 c++ api接口只需要引用sqlite3.h头文件就行。
常用术语:表(table)、字段(column,列,属性)、记录(row,record)。
存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。
2、数据库语句
2.1、创建或打开数据库
对应c++代码
//不存在即创建数据库sqlite3* db;int res = sqlite3_open(sql_name,&db);if(res){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));qDebug() << "database failed to open ";}else{qDebug() << "database open sucess";}
2.2、数据定义语句
- 新建表 ⟹ create:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。); create table if not exists 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。);
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);
- 删除表 ⟹ drop:dorp table 表名;drop table if exists 表名;
DROP TABLE IF EXISTS t_person;
对应c++代码:
//回调函数
static int callback(void *NotUsed, int argc, char **argv, char **azColName){int i;for(i=0; i<argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}
//判断表是否存在/* Create SQL statement */char *sql = "CREATE TABLE IF NOT EXISTS COMPANY(" \ //只是创建表 "CREATE TABLE COMPANY(""ID INT PRIMARY KEY NOT NULL," \"TIME_START TEXT NOT NULL," \"TIME_END TEXT NOT NULL," \"DETECT_IP TEXT NOT NULL," \"CONTAINER_NUM TEXT NOT NULL," \"REAL_RESULTS TEXT NOT NULL," \"DETECT_RESULTS TEXT NOT NULL," \"DETECT_TIME TEXT NOT NULL," \"NOTE TEXT NOT NULL);";/* Execute SQL statement */char *zErrMsg = 0;int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Table created successfully\n");}
//若存在则删除表/* drop SQL statement */char *sql_d = "DROP TABLE IF EXISTS COMPANY;"; //删除表不做判断 "DROP TABLE COMPANY("/* Execute SQL statement */char *zErrMsg = 0;int rc = sqlite3_exec(db, sql_d, NULL, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Table drop successfully\n");}
2.3、数据操作语句
- 添加表中的数据 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串内容用单引号。
INSERT INTO t_person (name, age) VALUES ('大明', 22);
- 修改表中的数据 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;
UPDATE t_person SET name = '小明', age = 10; // 把表中name字段的值全部改成小明,age字段的值全部改成10。
UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改为12。
- 删除表中的数据 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。
DELETE FROM t_person; // 删除表中的所有记录。
DELETE FROM t_person WHERE age = 25; // 删除表中字段age等于25的这条记录。
DELETE FROM t_person WHERE age > 12 AND age < 15; // 删除表中年龄大于12且小于15的记录。
写入数据方式一:
sqlite3* db;int res = sqlite3_open(sql_name,&db);if(res){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));qDebug() << "database failed to open ";}else{qDebug() << "database2 open sucess";}/* INSERT SQL statement */ID += 1;time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();time.start();char *zErrMsg = 0;std::string local_ip = "'192.168.53.21'";int64_t time_end =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();std::string container_num = "'#^XH^123456^42G1^'";QString isEmptoy = "'空箱'";//char detect_results = 0x00;std::string detect_results_sql;std::string note = "''" ;qDebug()<< "detect_results : "<<detect_results;detect_results_sql = "'未执行检测'";note = "'设备防夹保护触发,设备停止运动'";int timeElapsed = time.elapsed();qDebug()<< "timeElapsed : "<<timeElapsed<<" ms";//float detect_time = float(time_end -time_start)/1000;float detect_time = float(timeElapsed)/1000;std::string sql_add = "INSERT INTO COMPANY (ID,TIME_START,TIME_END,DETECT_IP,CONTAINER_NUM,REAL_RESULTS,DETECT_RESULTS,DETECT_TIME,NOTE) ""VALUES(" + std::to_string(ID)+","+ std::to_string(time_start)+","+ std::to_string(time_end)+","+local_ip+","""+container_num+","+isEmptoy.toStdString()+","+detect_results_sql+","+std::to_string(detect_time)+","+note+"); " ;/* Execute SQL statement */int rc = sqlite3_exec(db, sql_add.c_str(), callback, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "INSERT2 created successfully\n");}sqlite3_close(db);
}
写入数据方式二:
第二种写入数据的方式------------------------------------------sqlite3_exec(db,"begin;",0,0,0);int64_t time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();std::string local_ip = "192.168.53.21";sqlite3_stmt *stmt;const char* sql_insert = "INSERT INTO COMPANY (ID,TIME_START,DETECT_IP) VALUES(?,?,? );" ;int ret = sqlite3_prepare_v2(db,sql_insert,-1,&stmt,0);if(ret == SQLITE_OK){sqlite3_bind_int(stmt,1,1);sqlite3_bind_int64(stmt,2,time_start);//sqlite3_bind_text(stmt,2,local_ip.c_str(),-1,SQLITE_STATIC);sqlite3_bind_text(stmt,3,local_ip.c_str(),-1,SQLITE_STATIC);ret = sqlite3_step(stmt);
// if(rc != SQLITE_DONE)
// {
// fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
// sqlite3_close(db);
// }sqlite3_reset(stmt);sqlite3_finalize(stmt);}else{fprintf(stderr, "SQL error: %s\n", zErrMsg);}sqlite3_exec(db,"commit;",0,0,0);sqlite3_free(zErrMsg);
2.3查询数据
- select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查询所有的字段)
- 表别名:select 字段1 别名, 字段2 别名,。。。from 表名 别名;select 字段1 别名, 字段2 as 别名,。。。from 表名 as 别名;select 别名.字段1,别名.字段2,。。。from 表名 别名;
SELECT name, age FROM t_person WHERE age < 80;
SELECT * FROM t_person WHERE age < 80;
SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
- 计算记录条数:select count(字段或者*) from 表名;
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
SELECT count(*) FROM t_person ren WHERE ren.age > 80;
- where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
- order by:select * from 表名 order by 字段(默认升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC; // 先按年龄降序,再按名字升序。
- limit:select * from 表名 limit 数值1,数值2;分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条。select * from 表名 limit 数值2;(跳过前面0条,相当于select * from 表名 limit 0,数值2,表示最前面多少条数据)
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先筛选,后排序,再分页。
- like:模糊查询,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;
SELECT * FROM t_person WHERE name like '%明%';
查询ID:(用处:获取当前数据库的所写的行数)
//获取当前数据库最大ID值char **dbresult;int nrow,ncolumn;char *sql_select = "SELECT * from COMPANY";res = sqlite3_get_table(db,sql_select,&dbresult,&nrow,&ncolumn,&zErrMsg);if(res == SQLITE_OK){//查询成功ID = nrow;qDebug() << "nrow :" << nrow;}else{fprintf(stderr, "SQL error: %s\n", zErrMsg);qDebug() << "SELECT error :" ;}//释放 dbresult 的查询结果sqlite3_free_table(dbresult);
3、Ubuntu和nano安装sqlite3
3.1、Ubuntu安装sqlite3
sudo apt-get install sqlite3
//查看版本信息
sqlite3 -version
3.2、nano安装sqlite3
使用apt在Nano上安装,但是找不到sqlite3.h,所以只能使用源码编译。
下载源码:SQLite Download Page
//解压
tar xvzf sqlite-autoconf-3310100.tar.gz
//进入sqlite文件夹
cd sqlite-autoconf-3310100
//配置文件
./configure
//开始编译
make
//写入系统文件中
sudo make install
//查看文件路径
dpkg -L sqlite3
SQLite数据库使用(sqlite3 c++)相关推荐
- python建立sqlite数据库_python sqlite3 创建数据库
Python标准库14 数据库 (sqlite3) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关 ...
- python对sqlite增删改查_Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】...
本文实例讲述了python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的 ...
- Sqlite数据库导入到MySQL中
导出Sqlite数据库 下载sqlite3命令行工具,进入命令行 切换目录到数据库文件所在目录[把数据库文件拷贝到sqlite3目录下则跳过这步] 注意:在Windows下,目录是用\,在这里要输入两 ...
- 使用iOS原生sqlite3框架对sqlite数据库进行操作
摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...
- c语言sqlite3写数据类型,在sqlite数据库中,int类型不等于integer数据类型
在sqlite数据库中,int类型不等于integer数据类型 这些天一直在忙销售管理软件易卖通客户端的程序编写,由于需要采用本地数据缓存机制来提高程序的数据访问效率,所以需要在客户端使用一个小巧的本 ...
- sqlite数据库下载安装和初步操作和所遇到的问题near sqlite3:syntax error
1.下载sqlite数据库:http://www.sqlite.org/download.html 如果是在window上安装需要在 Windows 区下载预编译的二进制文件.如图下载下载 sqlit ...
- pdo sqlite_ sqlite2 pdo_mysql_PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明!(PHP+Sqlite2和PHP+Sqlite3)...
PHP+Sqlite2和PHP+Sqlite3 PHP数据库连接篇,PDO连接sqlite数据库,Sqlite安装使用说明! SQLite是一种轻量级的关系型数据库,可以内嵌在我们的应用程序中一起发布 ...
- python创建sqlite3数据库_Python连接SQLite数据库
Python连接SQLite数据库 SQLite 是一种嵌入式数据库,它的数据库就是一个文件.由于 SQLite 本身是 C 写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在 iOS 和 ...
- 【SQLite数据库学习】 初步了解Sqlite3数据库
目录 一:什么是数据库 二:为什么使用数据库 三:数据库的特点 四:如何使用数据库[关于数据库的常见术语] 五:常见的SQL语句的使用 一:什么是数据库 结构化查询语句 是一种对关系型数据库中的数据进 ...
- C++ VS2013环境编译使用sqlite数据库全过程
转载:http://www.cnblogs.com/imoon/archive/2012/11/30/2796726.html 转载:https://blog.csdn.net/hjm4702192/ ...
最新文章
- Tableau可视化分析实战系列浏览 Tableau 环境(五) -视图的部件
- JAVA爬虫三大运营商
- mysql常用命令集合 及附图操作
- 在Elasticsearch中索引Java Bean的简单方法
- visualvm安装插件
- raspberry pi_使用Kubernetes在Raspberry Pi上进行集群计算
- 特斯拉得克萨斯超级工厂正式开业 计划明年开始生产电动皮卡
- 只用一个WiFi,渗透进企业全部内网
- vim常用操作技巧与配置
- 还在为保研和研究生毕业发愁吗?呐,给你推荐最近的几个保底的会议~
- 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
- SwitchHost常见问题解决
- python爬虫贴吧_Python爬虫——抓取贴吧帖子
- mysql outer apply_使用 CROSS APPLY 与 OUTER APPLY 连接查询
- html dom onblur,html的DOM中Event对象onblur事件用法实例
- C语言学习书籍推荐《明解C语言》下载
- 加拿大LMIA劳工批文有效期延长至18个月,为海外劳工在加拿大临时工作及移民创造便利条件
- 摘录的Tim Urban关于拖延症的总结
- 记住这三个方法,让你的钱越花越多
- Java生成PDF文件(Itext篇)
热门文章
- win7计算器功能详解
- 数据的经济活动及其所需要的权利
- 51单片机流水灯三种实现方法
- matlab fft时域采样,信号时域采样 谱分析(matlab).doc
- Solidworks二次开发 Addin模版使用
- localhost改成想要的IP方法
- 查看动态库.dll是多少位的
- window如何连接mysql_window怎么连接mysql
- SmartRF_Packet_Sniffer_2.18.1软件__2.18.0软件
- 自己动手写打印机监控程序