1. #include <iostream>
  2. #include <sqlite3.h>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. cout << "Hello World!" << endl;
  8. sqlite3 *sql = NULL; // 一个打开的数据库实例
  9. const char * path = "/home/gaoyuan/temp/test.db";//某个sql文件的路径
  10.  
  11. // 根据文件路径打开数据库连接。如果数据库不存在,则创建。
  12. // 数据库文件的路径必须以C字符串传入。
  13. int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL);
  14.  
  15. if (result == SQLITE_OK) {
  16. std::clog << "打开数据库连接成功";
  17. }
  18. else {
  19. std::clog << "打开数据库连接失败";
  20. }
  21.  
  22. return ;
  23. }

打开或者创建数据库

  1. const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); "; //SQL语句
  2. sqlite3_stmt *stmt = NULL; //stmt语句句柄
  3.  
  4. //进行插入前的准备工作——检查语句合法性
  5. //-1代表系统会自动计算SQL语句的长度
  6. int result = sqlite3_prepare_v2(sql, sqlSentence, -, &stmt, NULL);
  7.  
  8. if (result == SQLITE_OK) {
  9. std::clog<< "添加数据语句OK";
  10. //执行该语句
  11. sqlite3_step(stmt);
  12. }
  13. else {
  14. std::clog << "添加数据语句有问题";
  15. }
  16. //清理语句句柄,准备执行下一个语句
  17. sqlite3_finalize(stmt);

执行不返回数据的SQL语句(增、删、改)。

执行更新、删除语句和执行创表、添加语句基本类似,只需更改sql语句即可。)

  1. const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;"; //SQL语句
  2. sqlite3_stmt *stmt = NULL; // stmt语句句柄
  3.  
  4. //进行查询前的准备工作——检查语句合法性
  5. //-1代表系统会自动计算SQL语句的长度
  6. int result = sqlite3_prepare_v2(sql, sqlSentence, -, &stmt, NULL);
  7.  
  8. if (result == SQLITE_OK) {
  9. std::clog << "查询语句OK";
  10. // 每调一次sqlite3_step()函数,stmt语句句柄就会指向下一条记录
  11. while (sqlite3_step(stmt) == SQLITE_ROW) {
  12. // 取出第0列字段的值
  13. const unsigned char *name = sqlite3_column_text(stmt, );
  14. // 取出第1列字段的值
  15. int age = sqlite3_column_int(stmt, );
  16. //输出相关查询的数据
  17. std::clog << "name = " << name <<", age = "<< age;
  18. }
  19. }
  20. else {
  21. std::clog << "查询语句有问题";
  22. }
  23. //清理语句句柄,准备执行下一个语句
  24. sqlite3_finalize(stmt);

执行返回数据的SQL语句(查)。

  1. if (sql) {
  2. sqlite3_close_v2(sql);
  3. sql = nullptr;
  4. }

关闭数据库:sqlite3_close_v2(sqlite3* sql)

SQLite3 库函数 总结

1.打开数据库

  1. int sqlite3_open_v2(
  2. const char *filename,   // 数据库的文件路径
  3. sqlite3 **ppDb,       // 数据库实例
  4. int flags,          // 标志
  5. const char *zVfs      // 使用该数据库的虚拟机的名字,这里我们不需要用,直接NULL
  6. );

其中:

flags参数有如下标志:
SQLITE_OPEN_NOMUTEX: 设置数据库连接运行在多线程模式(没有指定单线程模式的情况下)
SQLITE_OPEN_FULLMUTEX:设置数据库连接运行在串行模式。
SQLITE_OPEN_SHAREDCACHE:设置运行在共享缓存模式。
SQLITE_OPEN_PRIVATECACHE:设置运行在非共享缓存模式。
SQLITE_OPEN_READWRITE:指定数据库连接可以读写。
SQLITE_OPEN_CREATE:如果数据库不存在,则创建。

2.检查SQL语句的合法性(查询前的准备)

若语句合法即编译通过,则将语句产生的指令塞进stmt句柄(此时并未执行指令)

  1. int sqlite3_prepare_v2(
  2. sqlite3 *db, // 数据库实例
  3. const char *zSql, // 需要检查的SQL语句
  4. int nByte, // SQL语句的最大字节长度
  5. sqlite3_stmt **ppStmt, // stmt句柄,用来存储SQL stmt指令
  6. const char **pzTail
  7. );

3.执行stmt句柄(执行存储在stmt句柄的指令

如果指令能查询到下一行数据,就会返回SQLITE_ROW

如果指令(例如写入数据)不需要返还数据,就会返还SQLITE_DONE

  1. int sqlite3_step(
  2.   sqlite3_stmt* stmt   //stmt句柄
  3. );

4.利用stmt句柄获得第iCol字段的值(字段的下标从0开始)

//执行完查询句柄后,stmt就会指向查到的数据

//然后可以通过stmt获取相应数据

  1. double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据
  2. int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
  3. sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
  4. const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
  5. const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据

其他:

清理语句句柄(以便重复使用同一个stmt句柄)

  1. int sqlite3_finalize(
  2.   sqlite_stmt* stmt      //stmt句柄
  3. );

关闭数据库连接

  1. int sqlite3_close_v2(
  2.   sqlite3 * sql, // 数据库实例
  3. );

直接编译并执行 SQL语句

(不推荐使用:1、没有SQL语法检查 2、每一句SQL语句即使完全一样,也会重新编译执行,对批量指令来说效率不高。)

  1. int sqlite3_exec(
  2. sqlite3* sql, // 一个打开的数据库实例
  3. const char * sqlSentence, // 需要执行的SQL语句
  4. int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调
  5. void *, // 回调函数的第1个参数
  6. char **errmsg // 错误信息
  7. );

|额外:使用SQLiteStudio工具来辅佐

SQLiteStudio是一个可视化的数据库管理工具。

通过可视化界面,它可以方便快捷地查看或操作数据库信息。

它是程序sqlite数据调试检查不可或缺的辅助工具。

(界面大概如图:)

SQLiteStudio 下载地址:https://sqlitestudio.pl/index.rvt?act=download

[转]c++ 开发 sqlite的更多相关文章

  1. windows phone 8.1开发SQlite数据库引用安装

    原文出自:http://www.bcmeng.com/windows-phone-sqlite/ windows phone 8.1开发SQlite数据库引用安装 第一步: 安装SQlite forw ...

  2. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  3. iOS开发--SQLite重要框架FMDB的使用

    什么是FMDB: FMDB是一个和iOS的SQLite数据库操作相关的第三方框架.主要把C语言操作数据库的代码用OC进行了封装.使用者只需调用该框架的API就能用来创建并连接数据库,创建表,查询等. ...

  4. Android数据库开发——SQLite

    上篇博客提到过SQLite,它是嵌入式数据库,由于其轻巧但功能强大,被广泛的用于嵌入式设备当中.后来在智能手机.平板流行之后,它作为文件型数据库,几乎成为了智能设备单机数据库的必选,可以随着安卓app ...

  5. 使用Python开发SQLite代理服务器(转载)

    转载:https://mp.weixin.qq.com/s?timestamp=1498531736&src=3&ver=1&signature=Eq6DPvkuGJi*G5s ...

  6. android开发--sqlite数据库

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQL ...

  7. WP7开发 Sqlite数据库的使用 解决Unable open the database

    WP7本身不支持Sqlite数据库,但我们可以添加第三方组件让它支持Sqlite. 首先在项目中添加引用Community.CsharpSqlite.WP.dll,我会放后面让大家下载,我下了有几天了 ...

  8. (转)python 开发 sqlite 绝对完整

    '''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说 没有独立的维护进程,所有的维护都来自于程序本身. 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不 ...

  9. Android开发 ---SQLite数据库,lock文件,结果集游标,适配器,安全退出,给连接设置下划线,编辑器,投影,ContentValues存储,DbHelper,activity栈

    目录截图: 1.activity_main.xml 主界面效果: <?xml version="1.0" encoding="utf-8"?> &l ...

  10. Android开发SQLite数据库的创建

    package com.example.db; import android.content.Context; import android.database.sqlite.SQLiteDatabas ...

随机推荐

  1. Windows10家庭版安装docker攻略

    在公司,一直使用mac系统,在mac上安装使用docker还是比较方便的,可本人心血来朝,家里是win10 home版,就想在windows上刷一刷. 好了,废话不多说,直接上干货. 为了不误导广大爱 ...

  2. Web数据库架构

    Web服务器的基本操作如图下图所示: 这个系统由两个对象组成:一个Web浏览器和一个Web服务器.它们之间需要通信连接.Web浏览器向服务器发出请求.服务器返回一个响应.这种架构非常适合服务器发布静态 ...

  3. CentOS7下的AIDE入侵检测配置

    一.AIDE的概念 AIDE:Advanced Intrusion Detection Environment,是一款入侵检测工具,主要用途是检查文档的完整性.AIDE在本地构造了一个基准的数据库,一 ...

  4. Linux跑脚本用sh和./有什么区别?

    一个很有意思的例子: sh是一个shell.运行sh a.sh,表示我使用sh来解释这个脚本:如果我直接运行./a.sh,首先你会查找脚本第一行是否指定了解释器,如果没指定,那么就用当前系统默认的sh ...

  5. 项目Beta冲刺——凡事预则立

    班级:软件工程1916|W 作业:项目Beta冲刺(团队) 团队名称:Echo 作业目标:规定代码规范,明确冲刺任务与计划 目录 团队博客汇总 讨论组长是否重选的议题和结论 下一阶段需要改进完善的功能 ...

  6. luoguP2768: 珍珠项链(矩阵乘法优化DP)

    题意:有K种珍珠,每种N颗,求长度为1~N的项链,包含K种珍珠的项链种类数.N<=1e9, K<=30; 思路:矩阵快速幂,加个1累加前缀和即可. #include<bits/std ...

  7. 【Selenium-WebDriver实战篇】ScreenRecorder的实际输出路径,自己的解决方案

    ==================================================================================================== ...

  8. springboot项目报错Could not resolve placeholder 'datasource.type' in value "${datasource.type}"解决办法

    一,首先确认数据库的连接信息是否都正确,数据库能否正常连接(例如用客户端能连接上):二,确认配置文件中datasource.type配置是否正确,此处我们公司用的阿里的是com.alibaba.dru ...

  9. java项目部署

    本文章只为帮助大家学习项目的发布,为基础篇,在此给大家示范在window环境下的项目部署及运维. 以下版本为讲解示例,可自行改至匹配版本. 服务器:window service2008 R2 Stan ...

  10. hdu3625

    hdu3625 题意: 酒店发生一起谋杀案.作为镇上最好的侦探,您应该立即检查酒店的所有N个房间.但是,房间的所有门都是锁着的,钥匙刚锁在房间里,真是个陷阱!您知道每个房间里只有一把钥匙,并且所有可能 ...