sqlite3学习笔记-方法介绍和测试代码
创建数据库 :sqlite3 test.db
查看数据数据 : .databases
创建表 :create table student (id integer primary key autoincrement,name txt,age int, birthday txt)
查看表 :.tables
删除表:drop table test.menber
===========================================================================
内连接 - INNER JOIN
内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。
SELECT * FROM student as a INNER JOIN company as b ON a.age=b.age;
student.
1 22 che
2 23 jiajiae
3 27 hahah
company:
4 chelin 27 1992-10-15 00:00:00
3 linglin 27 1992-10-15 00:00:00
1 chejia 27 1992-008-12 00:00:00
2 wanglei 32 1988-008-12 00:00:00
结果:
3 27 hahah 1 chejia 27 1992-008-12 00:00:00
3 27 hahah 4 chelin 27 1992-10-15 00:00:00
3 27 hahah 3 linglin 27 1992-10-15 00:00:00======================================================================
接口介绍
1. sqlite3_open():打开数据库在操作数据库之前,首先要打开数据库。
这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。
这个操作同时程序中的第一个调用 的sqlite函数,同时也是其他sqlite api的先决条件。
许多的sqlite接口函数都需要一个数据库连接对象的指针作为它们的第一个参数。
函数定义
int sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */);
int sqlite3_open16(const void *filename, /* Database filename (UTF-16) */sqlite3 **ppDb /* OUT: SQLite db handle */);
int sqlite3_open_v2(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb, /* OUT: SQLite db handle */int flags, /* Flags */const char *zVfs /* Name of VFS module to use */);
说明:假如这个要被打开的数据文件不存在,则一个同名的数据库文件将被创建。
如果使用sqlite3_open和sqlite3_open_v2的话,数据库将采用UTF-8的编码方式,sqlite3_open16采用UTF-16的编码方式返回值:如果sqlite数据库被成功打开(或创建),将会返回SQLITE_OK,否则将会返回错误码。
Sqlite3_errmsg()或者sqlite3_errmsg16可以用于获得数据库打开错误码的英文描述,
这两个函数定义为:
const char *sqlite3_errmsg(sqlite3*);const void *sqlite3_errmsg16(sqlite3*);
无论是否成功打开数据库, 都应该使用 sqlite3_close() 关闭数据库连接.
参数说明:filename:需要被打开的数据库文件的文件名,在sqlite3_open和sqlite3_open_v2中这个参数采用UTF-8编码
而在sqlite3_open16中则采用UTF-16编码ppDb:一个数据库连接句柄被返回到这个参数,即使发生错误。
唯一的一场是如果sqlite不能分配内存来存放sqlite对象,ppDb将会被返回一个NULL值。
flags:作为数据库连接的额外控制的参数,可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一个,用于控制数据库的打开方式,可以和SQLITE_OPEN_NOMUTEX,SQLITE_OPEN_FULLMUTEX,SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE结合使用,
======================================================================
sqlite3_prepare这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。
这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。
它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句
int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);
int sqlite3_prepare16(sqlite3*, const void*, int, sqlite3_stmt**, const void**);
int sqlite3_finalize(sqlite3_stmt*);
int sqlite3_reset(sqlite3_stmt*);
sqlite3_prepare 接口把一条SQL语句编译成字节码留给后面的执行函数.
sqlite3_finalize() 将销毁一个准备好的SQL声明. 在数据库关闭之前,所有准备好的声明都必须被释放销毁.
sqlite3_reset() 函数用来重置一个SQL声明的状态,使得它可以被再次执行.
======================================================================
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, long long int);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
第一个参数始终是指向sqlite3_prepare_v2()或其变体返回的sqlite3_stmt对象 的指针。
第二个参数是要设置的SQL参数的索引 起始索引是1;
第三个参数是绑定到参数的值
第四个参数的那些例程中,其值是参数中的字节数
第五个参数是一个析构函数,第三个参数是NULL指针或第四个参数为负,则不会调用析构函数。五个参数是特殊值 SQLITE_STATIC,那么SQLite假定信息在静态的非托管空间中,并且不需要释放。如果第五个参数的值为SQLITE_TRANSIENT,则SQLite会在sqlite3_bind _ *()例程返回之前立即创建自己的数据私有副本。
第六个参数必须是 SQLITE_UTF8,SQLITE_UTF16,SQLITE_UTF16BE或SQLITE_UTF16LE之一, 以指定第三个参数中文本的编码。
============================================================
int sqlite3_step(sqlite3_stmt*);
如果SQL返回了一个单行结果集,sqlite3_step() 函数将返回 SQLITE_ROW , 如果SQL语句执行成功或者正常将返回 SQLITE_DONE , 否则将返回错误代码. 如果不能打开数据库文件则会返回 SQLITE_BUSY
============================================================
获得记录集行中的数据:
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
int sqlite3_column_count(sqlite3_stmt*);
const char *sqlite3_column_decltype(sqlite3_stmt *, int iCol);
const void *sqlite3_column_decltype16(sqlite3_stmt *, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
long long int sqlite3_column_int64(sqlite3_stmt*, int iCol);
const char *sqlite3_column_name(sqlite3_stmt*, int iCol);
const void *sqlite3_column_name16(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);
sqlite3_column_count()函数返回结果集中包含的列数. sqlite3_column_count() 可以在执行了 sqlite3_prepare()之后的任何时刻调用. sqlite3_data_count()除了必需要在sqlite3_step()之后调用之外,其他跟sqlite3_column_count()大同小异.
如果调用sqlite3_step()返回值是 SQLITE_DONE 或者一个错误代码, 则此时调用sqlite3_data_count()将返回 0 ,
然而 sqlite3_column_count() 仍然会返回结果集中包含的列数.
返回的记录集通过使用其它的几个 sqlite3_column_***() 函数来提取, 所有的这些函数都把列的编号作为第二个参数. 列编号从左到右以零起始. 请注意它和之前那些从1起始的参数的不同.
sqlite3_column_type()函数返回第N列的值的数据类型. 具体的返回值如下:
#define SQLITE_INTEGER 1
#define SQLITE_FLOAT 2
#define SQLITE_TEXT 3
#define SQLITE_BLOB 4
#define SQLITE_NULL 5
sqlite3_column_decltype() 则用来返回该列在 CREATE TABLE 语句中声明的类型.
它可以用在当返回类型是空字符串的时候.
sqlite3_column_name() 返回第N列的字段名.
sqlite3_column_bytes() 用来返回 UTF-8 编码的BLOBs列的字节数或者TEXT字符串的字节数.
sqlite3_column_bytes16() 对于BLOBs列返回同样的结果,但是对于TEXT字符串则按 UTF-16 的编码来计算字节数.
sqlite3_column_blob() 返回 BLOB 数据. (二进制数据)
sqlite3_column_text() 返回 UTF-8 编码的 TEXT 数据.
sqlite3_column_text16() 返回 UTF-16 编码的 TEXT 数据.
sqlite3_column_int() 以本地主机的整数格式返回一个整数值.
sqlite3_column_int64() 返回一个64位的整数.
sqlite3_column_double() 返回浮点数.
========================================================================================
int sqlite3_close(sqlite3*);
这个过程关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放
=====================================
intsqlite3_errcode(sqlite3* pDB /* SQLite3 数据库句柄 */);说明:该函数返回最近一次调用 sqlite3_ API时产生的错误码.
const char *sqlite3_errmsg(sqlite3* pDB /* SQLite3 数据库句柄 */);说明:该函数返回与pDB数据库指针相关的错误信息
测试代码:
#include<iostream>
#include"../sqlite3/sqlite3.h"
using namespace std;// 根据文件路径打开数据库连接。如果数据库不存在,则创建。
// 数据库文件的路径必须以C字符串传入。
sqlite3 *sql = nullptr; // 一个打开的数据库实例void insert_data()
{char buf[128];for (int i = 35000; i < 35010; i++){memset(buf, 0, 128);sprintf_s(buf, 128, "INSERT INTO test(id, name) VALUES(%d,'%05d'); ", i, i);//char *sqlSentence = buf; //SQLchar *sqlSentence = "INSERT INTO test(id, name) VALUES(?,:aaa); "; //SQL语句sqlite3_stmt *stmt = nullptr; //stmt语句句柄//进行插入前的准备工作——检查语句合法性//-1代表系统会自动计算SQL语句的长度int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);//sqlite3_bind_blob(stmt,)sqlite3_bind_int(stmt, 1, i);sqlite3_bind_text(stmt, 2, "chejia", -1, nullptr);result = sqlite3_step(stmt);// == SQLITE_DONE;if (result == SQLITE_DONE) {//std::clog << "添加数据语句OK" << endl;//执行该语句}else {std::clog << "添加数据语句有问题" << endl;}//清理语句句柄,准备执行下一个语句sqlite3_finalize(stmt);}
}void selcet_test()
{const char *sqlSentence = "SELECT * from test; "; //SQL语句sqlite3_stmt *stmt = NULL; // stmt语句句柄//进行查询前的准备工作——检查语句合法性//-1代表系统会自动计算SQL语句的长度int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);if (result == SQLITE_OK) {std::clog << "查询语句OK";// 每调一次sqlite3_step()函数,stmt语句句柄就会指向下一条记录while (sqlite3_step(stmt) == SQLITE_ROW) {// 取出第0列字段的值int id = sqlite3_column_int(stmt, 0);// 取出第1列字段的值const unsigned char *name = sqlite3_column_text(stmt, 1);//输出相关查询的数据std::clog << "id = " << id << ", name = " << name << endl;}}else {std::clog << "查询语句有问题<<endl";}//清理语句句柄,准备执行下一个语句sqlite3_finalize(stmt);
}
int main()
{const char * path = "C:\\Users\\admin\\test.db";//某个sql文件的路径int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL);if (result == SQLITE_OK) {std::clog << "打开数据库连接成功" << endl;}else {std::clog << "打开数据库连接失败"<<endl;}insert_data();//selcet_test();sqlite3_close(sql);}
sqlite3学习笔记-方法介绍和测试代码相关推荐
- 《Python编程:从入门到实践》学习笔记——第11章 测试代码
文章目录 前言 1 测试函数 1.1 单元测试和测试用例 1.2 可通过的测试 1.3 不能通过的测试 1.4 测试未通过时怎么办 1.5 添加新测试 2 测试类 2.1 各种断言方法 2.2 一个要 ...
- 《Go语言圣经》学习笔记 第十一章 测试
<Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...
- Clojure学习笔记(一)——介绍、安装和语法
Clojure学习笔记(一)--介绍.安装和语法 什么是Clojure Clojure是一种动态的.强类型的.寄居在JVM上的语言. Clojure的特性: 函数式编程基础,包括一套性能可以和典型可变 ...
- UE4 Material 101学习笔记——01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化
UE4 Material 101学习笔记--01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化 Lec 01 什么是着色器 What Is A Shader? 1.1 介绍 ...
- 思维导图的分类 利用思维导图绘制学习知识方法介绍
思维导图是一种对学习很有效的帮助方法,可以说对学生的帮助是最大的,学生运用思维导图的积极性非常高,每个同学根据自己的所做所想绘制出可以对自己有帮助的思维导图从而对学习会达到一个新的认知,然后渐渐喜欢上 ...
- Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例
Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...
- wyy课堂cmos模拟设计课学习笔记-器件介绍
推荐一下wyy课堂的cmos模拟课程,比之前便宜好多就果断买了. wyy课堂cmos模拟设计课学习笔记-器件介绍 一.工艺库介绍的相关文件 二.bipolar 三.mos 四.电阻 五.电容 六.电感 ...
- 经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现)
前言 在上一期中介绍了VGG,VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩,而今天要介绍的就是同年分类任务的第一名--GoogLeNet . 作为2014年Ima ...
- Java Web--HTML、CSS、JavaScript详细学习笔记(内含丰富示例代码)
** Java Web–HTML.CSS.JavaScript学习笔记 ** HTML(Hyper Text Markup Language超文本标记语言):控制的是页面的内容,是由标签组成的语言,能 ...
最新文章
- 论文简述 | 无需校正和不失真的实时变化的鱼眼双目
- .NET种Json时对单引号和特殊字符串的处理
- 你与弄懂promise之间可能只差这篇文章(二)
- 剑指OFFER的跳台阶问题
- python学习(九) 网络编程学习--简易网站服务器
- c语言二维数组总成绩,c语言5个人3科成绩总分和平均分,用二维数组
- debian9.4网络配置及永久静态默认路由
- 填报true\false和复选框应用及导出打印显示复
- 自动化测试工具-Airtest
- HJ212国家环保标准的数据上报-专用智能网关IGT-SER
- 星绞计算机电缆,永安市铠装计算机电缆DJYJP3V22截面图
- switch日文键盘打中文_12月有哪些Switch游戏值得期待?
- 最近做到的一些有意思的数学题目(博弈,双人玩游戏)
- 2022海外流媒体十大技术趋势
- 用QRCode生成带有中间logo图的二维码
- 玉米社:抖音短视频一般制作多长时间最好?为什么?
- 大华视频会议系统服务器配置,浙江大华视频会议解决方案-v-20210727005844.pdf-原创力文档...
- 用金蝶kis录入数量初始数据的方法
- 12.11 Daily Scrum
- 操作系统实验ucore lab7
热门文章
- 哪个html元素指定了页面描述,网页的设计HTML元素属性2.doc
- openssh漏洞_技术干货 | OpenSSH命令注入漏洞复现(CVE202015778)
- html有序列表序号怎么变色,html – 如何正确标记/样式有序列表以补偿大项目编号...
- java吃货联盟系统源码_小项目,吃货联盟,java初级小项目,源代码
- fat32转ntfs工具无损数据安全转换_干货真香! 无损制作UD三分区教程,新手小白的福利来了...
- windows python库安装包下载网站
- linux top 命令各参数详解
- Spring 7大功能模块的作用[转]
- WIN7与WIN10 安装
- 如何完成支付宝的支付功能?