SQLite - C-C++


SQLite是一个轻量级的关系型数据库管理系统,具有开源、易用、高性能、可嵌入等优点。它被广泛应用于移动设备、桌面应用程序等领域。SQLite在C语言基础上编写,可以跨平台运行在Windows、Linux、macOS等操作系统上。本文将介绍SQLite的C/C++接口和如何在C/C++程序中使用SQLite。

SQLite的基本概念和特点

  1. 数据库、表、字段

SQLite中的数据库由表组成,每个表包含多个字段。表和字段分别对应关系型数据库中的表和列,表名、字段名等都是字符串类型。

  1. 数据类型

SQLite支持多种数据类型,其中包括整型、浮点型、文本型、二进制型等。每个字段可以指定一个数据类型,也可以默认使用文本型。

  1. SQL语句

SQLite使用SQL(Structured Query Language)语句来进行数据库操作,包括SELECT、INSERT、UPDATE、DELETE等操作。通过使用SQL语句,可以对表进行增删改查等操作。

  1. 事务

SQLite支持事务,可以保证数据操作的原子性、一致性、隔离性和持久性。通过使用BEGIN、COMMIT等语句来处理事务。

SQLite的C/C++接口

SQLite提供了C/C++接口,允许开发者通过C/C++来操作数据库。

  1. sqlite3_open函数

sqlite3_open函数用于打开一个数据库,需要传入数据库文件名和一个指向sqlite3类型指针的指针。

int sqlite3_open(const char *filename, sqlite3 **ppDb)

  1. sqlite3_close函数

sqlite3_close函数用于关闭一个数据库,需要传入sqlite3类型指针。在关闭数据库之前,必须先释放所有相关资源。

int sqlite3_close(sqlite3*);

  1. sqlite3_exec函数

sqlite3_exec函数用于执行SQL语句,需要传入sqlite3类型指针、SQL语句字符串、回调函数指针和回调函数参数指针等参数。

int sqlite3_exec(sqlite3*, const char sql, int (callback)(void,int,char*,char**), void *, char **errmsg)

其中,callback函数用于处理执行SQL命令返回的结果,errmsg用于存储错误信息。

  1. sqlite3_prepare_v2函数

sqlite3_prepare_v2函数用于编译SQL语句,需要传入sqlite3类型指针、SQL语句字符串和一个指向sqlite3_stmt类型指针的指针。

int sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail);

  1. sqlite3_step函数

sqlite3_step函数用于逐行读取SQL查询结果,需要传入sqlite3_stmt类型指针,返回值为SQLITE_ROW表示读取到一行数据,SQLITE_DONE表示已读取完所有数据。

int sqlite3_step(sqlite3_stmt*);

  1. sqlite3_finalize函数

sqlite3_finalize函数用于释放编译SQL语句用的sqlite3_stmt类型指针,需要传入sqlite3_stmt类型指针。

int sqlite3_finalize(sqlite3_stmt *pStmt);

SQLite的C/C++库使用示例

以下是一个使用SQLite的C/C++程序示例,具体说明如下:

/* SQLite C/C++示例程序 */

#include <stdio.h> #include <sqlite3.h>

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; }

int main(int argc, char* argv[]){ sqlite3 *db; char zErrMsg = 0; int rc; const char data = “Callback function called”; char *sql;

/* 打开数据库 */ rc = sqlite3_open(“test.db”, &db); if( rc ){ fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db)); return 0; }else{ fprintf(stderr, “Opened database successfully\n”); }

/* 创建表 */ sql = “CREATE TABLE COMPANY(”
“ID INT PRIMARY KEY NOT NULL,”
“NAME TEXT NOT NULL,”
“AGE INT NOT NULL,”
“ADDRESS CHAR(50),”
“SALARY REAL );”;

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”); }

/* 插入数据 */ sql = “INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
“VALUES (1, ‘Paul’, 32, ‘California’, 20000.00 ); "
“INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
“VALUES (2, ‘Allen’, 25, ‘Texas’, 15000.00 ); "
“INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)”
“VALUES (3, ‘Teddy’, 23, ‘Norway’, 20000.00 );”
“INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)”
“VALUES (4, ‘Mark’, 25, ‘Rich-Mond’, 65000.00 );”;

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, “Records created successfully\n”); }

/* 查询数据 */ sql = “SELECT * from COMPANY”;

rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, “SQL error: %s\n”, zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, “Operation done successfully\n”); }

/* 关闭数据库 */ sqlite3_close(db);

return 0; }

首先,该程序使用sqlite3_open函数打开了一个名为test.db的数据库文件,如果文件不存在,则会创建一个新的数据库。

接下来,程序使用sqlite3_exec函数创建了一张名为COMPANY的表,该表包含ID、NAME、AGE、ADDRESS和SALARY五个字段。

随后,程序使用sqlite3_exec函数执行了四条INSERT INTO语句,向COMPANY表中插入数据。

最后,程序使用sqlite3_exec函数执行了一条SELECT语句,查询COMPANY表中的所有数据,并通过回调函数callback将查询结果输出到控制台。

最后,程序使用sqlite3_close函数关闭了打开的数据库。

总结

本文介绍了SQLite的C/C++接口和如何在C/C++程序中使用SQLite。使用SQLite这个简单的关系型数据库管理系统,可以为工业界应用和实验科研提供一个轻便、快速、稳定的数据存储与查询解决方案,适用于客户端、服务器、嵌入式设备等众多领域。