SQLite数据库使用指南以及相关API编程

SQLite介绍

  • SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎,被嵌入到所有移动设备和大部分计算机中,并且伴随着无数日常使用的应用程序一起提供。
  • SQLite的文件格式具有稳定性、跨平台性以及向后兼容性,开发者承诺将持续保持这种特性至少到2050年。因其特点,SQLite数据库文件常被用作不同系统间交换丰富内容的容器,并作为一种长期数据归档格式。目前,全球有超过1万亿(1e12)个SQLite数据库处于活跃使用状态。

SQLite相关链接

SQLite压缩包介绍及使用

  • 进入到SQLite下载页后,可以看到有很多压缩包。下面简单介绍下这些不同压缩包有什么区别。

  • Source Code -> sqlite-amalgamation-3450200.zip

    • 是 SQLite 数据库引擎提供的一个打包形式,它包含了编译 SQLite 库所需的所有 C 源代码文件的合并版本。这个包是为了简化 SQLite 的分发和集成到其他项目中而设计的。
    • 如果想在自己代码中集成SQLite数据库,下载这个包并包含其头文件和源文件即可。
  • Source Code -> sqlite-autoconf-3450200.tar.gz

    • SQLite 的另一种打包形式,它是为方便在类 Unix 系统(如 Linux、BSD、Mac OS X 等)上通过自动配置工具 autoconf 和 make 进行编译和安装而准备的。这个包通常包含了 SQLite 源代码以及用于生成可移植配置脚本(configure)的一系列辅助文件。
    • 这个包主要在Linux系统使用,如果不想集成SQLite源代码,而是集成SQLite的动态库,可以下载这个包在Linux系统上编译。
    • 这个包下载解压后,分别执行以下命令编译安装
    sh 复制代码
      ./configure --prefix=${pwd}/_install
      make
      make install
    • 执行完成后,在当前目录的_install目录下就会生成对应的头文件,库文件和可执行程序。
  • Documentation -> sqlite-doc-3450200.zip

    • SQLite的一些说明文档
  • Precompiled Binaries for Linux -> sqlite-tools-linux-x64-3450200.zip

    • 这个包是Linux平台X86架构的可执行程序,如果不需要将SQLite集成到代码中,可以直接下载这个包,在命令行执行SQL命令去操作数据库。
  • Precompiled Binaries for Windows -> sqlite-dll-win-x86-3450200.zip

    • 提供的Windows平台32位动态库
    • 这个包里只有动态库,我们需要借助Visual Studio生成一下静态库,如果安装的是Visual Studio 2015,找到 Microsoft Visual Studio 14.0\VC\bin\lib.exe这个程序,在cmd命令行执行以下命令
    sh 复制代码
      "D:\Microsoft Visual Studio 14.0\VC\bin\lib.exe" /def:sqlite3.def /machine:ix86
    • 执行成功后,就会生成静态库文件。
  • Precompiled Binaries for Windows -> sqlite-dll-win-x64-3450200.zip

    • 提供的Windows平台64位动态库,如何生成静态库参考上面。
  • Precompiled Binaries for Windows -> sqlite-tools-win-x64-3450200.zip

    • Windows平台可执行程序
    • 如果不想集成SQLite,可以直接下载这个包,在命令行运行程序执行SQL语句操作数据库。
  • Alternative Source Code Formats -> sqlite-src-3450200.zip

    • 这个包未经过预处理的SQLite源代码,它包含完整的源文件树结构,包括所有的C语言源码文件、头文件、Makefile以及其他支持文件。
  • 总结

    • 如果只需要通过命令行,执行SQL语句操作数据库,Linux平台下载这个包 sqlite-tools-linux-x64-3450200.zip,Windows平台下载 sqlite-tools-win-x64-3450200.zip。
    • 如果需要把SQLite以代码形式集成到我们的代码工程中,通过SQLite提供的API操作数据库。Windows和类Unix平台都可以直接使用这个包 sqlite-amalgamation-3450200.zip
    • 如果需要把SQLite以库形式集成到我们的代码工程中,类Unix平台下载这个包sqlite-autoconf-3450200.tar.gz去编译,Windows平台下载 sqlite-dll-win-x86-3450200.zip。

命令行使用

  • 启动SQLite

    • 直接运行sqlite可执行程序,以Windows为例
    • 运行成功后,就进入了数据库,接下来可以执行SQL语句来操作
  • 创建或打开数据库

    • 执行以下命令,就会打开或者一个数据库
    sql 复制代码
      .open student.db
  • 创建表
    *

    sql 复制代码
      CREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);
  • 插入数据
    *

    sql 复制代码
      INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1001, 'JACK', 98);
      INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1002, 'MARY', 96);
      INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1003, 'TOM', 96);
  • 查询数据
    *

    sql 复制代码
      SELECT * FROM STUDENT;
    • 可以看到表中就有了我们插入的数据。
  • 命令行的使用就不过多介绍,主要是SQL语句的使用。

SQLite API介绍

  • SQLite API编程常用的接口有以下几个

  • sqlite3_open
    *

    c 复制代码
      int sqlite3_open(const char *zFilename, sqlite3 **ppDb)
    • 函数功能:打开一个指向 SQLite 数据库文件的连接
    • 参数
      • zFilename:数据库名
      • ppDb : 数据库句柄
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_exec
    *

    c 复制代码
      int sqlite3_exec(sqlite3 *ppDb,  const char *sql,  int (*callback)(void*, int, char**,char**),  void *data,  char **errmsg)
    • 函数功能:执行SQL语句,异步接口。
    • 参数
      • ppDb:打开的数据库句柄
      • sql:需要执行的SQL语句
      • callback:回调函数,主要用于查询数据时,在该回调函数中获取数据
        • 参数1:回调函数可通过这个参数把数据传到外部
        • 参数2:查询的数据库表数据一共有多少行
        • 参数3:数据字段名
        • 数据4:数据值
      • data: 传递给回调函数的参数
      • errmsg:执行SQL语句出错时的错误信息
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_get_table
    *

    c 复制代码
      int sqlite3_get_table(sqlite3 *ppDb, const char *sql, char ***pazResult, int *pnRow, int *pnColumn, char **errmsg)
    • 函数功能:执行SQL语句,同步接口。
    • 参数
      • ppDb:数据库句柄
      • sql:需要执行的SQL语句
      • pazResult:输出参数,用于存储查询结果的二维字符数组指针
      • pnRow:输出参数,用于接收查询结果的行数
      • pnColumn:输出参数,用于接收查询结果的列数
      • errmsg:执行SQL语句出错时的错误信息
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_close
    *

    c 复制代码
      int sqlite3_close(sqlite3 *db);
    • 函数功能:关闭数据库

编程示例

c 复制代码
  #include <stdio.h>
  #include "sqlite3.h"
  
  int callback(void* para, int columenCount, char** columnValue, char** columnName) {
  	char *stData = (char*)para;
  	// 获取的数据可以在这里保存和处理,也可以通过保存到 para 参数中,在外部保存处理
  	for (int i = 0; i < columenCount; i++) {
  		printf("%s\t%s\n", columnName[i], columnValue[i]);
  	}
  	strcpy(stData, "this is callback");
  	return 0;
  }
  
  int main(){
  	sqlite3 *db = NULL;
  	char *zErrMsg = NULL;
  	char sql[1024] = { 0 };
  
  	// 打开数据库
  	int rc = sqlite3_open("student.db", &db);
  	if (rc != SQLITE_OK) {
  		printf("open sqlite failed, errMsg: %s.", sqlite3_errmsg(db));
  		return -1;
  	}
  
  	// 创建表
  	strcpy(sql, "CREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);");
  	rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("create table failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	// 插入数据
  	strcpy(sql, "INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1001, 'JACK', 98);INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1002, 'MARY', 96);INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1003, 'TOM', 96);");
  	rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("insert data failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	char stData[100] = { 0 };
  	strcpy(sql, "SELECT * FROM STUDENT;");
  	rc = sqlite3_exec(db, sql, callback, stData, &zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("query data failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	printf("stData = %s\n", stData);
  
  	// 同步接口
  	char **dbResult;
  	int nRow = 0, nColumn = 0;
  	strcpy(sql, "SELECT * FROM STUDENT;");
  	rc = sqlite3_get_table(db, sql, &dbResult, &nRow, &nColumn, zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("query data failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	// 打印字段名
  	for (int i = 0; i < nColumn; i++) {
  		printf("%s\t", dbResult[i]);
  	}
  	printf("\n");
  
  	//打印数据
  	for (int i = nColumn; i <= nRow * nColumn; i += nColumn) {
  		for (int j = 0; j < nColumn; j++) {
  			printf("%s\t", dbResult[i + j]);
  		}
  		printf("\n");
  	}
  
  	// 释放dbResult
  	sqlite3_free_table(dbResult);
  
  	sqlite3_close(db);
  
  	system("pause");
  	return 0;
  }
  • 打印结果

参考

相关推荐
PGCCC30 分钟前
【PGCCC】Postgresql 存储设计
数据库·postgresql
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
PcVue China2 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝5 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~5 小时前
【MySQL】summary
数据库·mysql
爱吃土豆的程序员5 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie
versatile_zpc6 小时前
C++初阶:类和对象(上)
开发语言·c++