法一:用官网编译好的动态库(推荐)
下载所需文件
sqlite官网地址:https://www.sqlite.org/howtocompile.html
下载以下的2个压缩包
第一个压缩包
- sqlite-amalgamation-xxxx.zip,xxxx是版本号,保持一致即可,这里面有sqite3.h
第二个压缩包,以64位为例
- sqlite-dll-win-x64-xxxx.zip,这里面有 sqlite3.dll 和 sqlite3.def(sqlite3.def将用来生成 sqlite3.lib )
- 32位的同理下载x86的文件就行(本文是讲的64位)
都放到一个文件夹下
比如D:\sqlite
生成静态库
- 打开 VS2022命令行,一般在开始菜单就可以找到
- 使用cd命令进入存放sqlite3相关文件的文件夹
- 接着输入
lib /MACHINE:X64 /DEF:sqlite3.def
生成的 sqlite3.lib 将会出现在存放sqlite3相关文件的目录
法二:自行编译源码生成所需动态库和静态库
这个方法还需要安装TCL库,稍微麻烦一些。
TCL库配置
1)TCL库下载地址
- 地址:https://sqlite.org/tmp/tcl9.0.0.tar.gz
- 下载后解压:比如我放在E:\github\third_party\sqlite\tcl9.0.0
2)安装TCL库
- 找到VS2022的命令行工具,64位为例
2)切换目录到安装的tcl的win目录下
3)执行命令:nmake /f makefile.vc release
4)安装 TCL 到指定目录
sqlite配置
1)下载sqlite源代码
- 地址:https://www.sqlite.org/howtocompile.html
2)VS2022命令行操作
1.进入源代码目录
2.设置环境变量
set TCLDIR=C:\Tcl
3.编译sqlite生成所需库
nmake /f makefile.msc
nmake /f makefile.msc sqlite3.c
nmake /f makefile.msc sqlite3.exe
3) 可以得到sqlite3.dll和sqlite3.lib
位于E:\github\third_party\sqlite\sqlite-src-3470200路径下
VS2022项目环境配置
上面的法一和法二选一种就行,更推荐法一。
在vs2022中使用sqlite3数据库需要3个文件,sqite3.h、sqlite3.dll、sqlite3.lib。
新建控制台项目,64位为例,用于测试
包含目录和库目录设置好路径
链接器输入
C++与sqlite交互测试代码
测试代码
//#include <sqlite3.h>
//#include <iostream>
//int main(int argc, char* argv[])
//{
// sqlite3* db = nullptr; // 数据库对象
// char* zErrMsg = nullptr; // 错误信息
// int rc = 0; // 执行结果
// rc = sqlite3_open("test.db", &db);
// if (rc) {
// fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
// exit(0);
// }
// else {
// fprintf(stderr, "Opened database successfully\n");
// }
// sqlite3_close(db);
// return 0;
//}#include <iostream>
#include <sqlite3.h>// 创建数据库连接
sqlite3* OpenDatabase(const char* dbFilePath) {sqlite3* db;// 打开数据库if (sqlite3_open(dbFilePath, &db) != SQLITE_OK) {std::cerr << "Error opening database." << std::endl;return nullptr;}return db;
}// 关闭数据库连接
void CloseDatabase(sqlite3* db) {sqlite3_close(db);
}// 创建表
void CreateTable(sqlite3* db) {const char* createTableSQL = "CREATE TABLE IF NOT EXISTS Users (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Age INTEGER);";if (sqlite3_exec(db, createTableSQL, nullptr, nullptr, nullptr) != SQLITE_OK) {std::cerr << "Error creating table." << std::endl;}else {std::cout << "Table created or already exists." << std::endl;}
}// 插入数据
void InsertData(sqlite3* db, const char* name, int age) {const char* insertDataSQL = "INSERT INTO Users (Name, Age) VALUES (?, ?);";sqlite3_stmt* statement;if (sqlite3_prepare_v2(db, insertDataSQL, -1, &statement, nullptr) == SQLITE_OK) {// 绑定参数sqlite3_bind_text(statement, 1, name, -1, SQLITE_STATIC);sqlite3_bind_int(statement, 2, age);// 执行语句if (sqlite3_step(statement) != SQLITE_DONE) {std::cerr << "Error inserting data." << std::endl;}else {std::cout << "Data inserted." << std::endl;}// 释放资源sqlite3_finalize(statement);}
}// 查询数据
void QueryData(sqlite3* db) {const char* queryDataSQL = "SELECT * FROM Users;";sqlite3_stmt* statement;if (sqlite3_prepare_v2(db, queryDataSQL, -1, &statement, nullptr) == SQLITE_OK) {std::cout << "Id\tName\tAge" << std::endl;// 遍历结果集while (sqlite3_step(statement) == SQLITE_ROW) {std::cout << sqlite3_column_int(statement, 0) << "\t"<< sqlite3_column_text(statement, 1) << "\t"<< sqlite3_column_int(statement, 2) << std::endl;}// 释放资源sqlite3_finalize(statement);}
}// 更新数据
void UpdateData(sqlite3* db, int id, const char* name, int age) {const char* updateDataSQL = "UPDATE Users SET Name=?, Age=? WHERE Id=?;";sqlite3_stmt* statement;if (sqlite3_prepare_v2(db, updateDataSQL, -1, &statement, nullptr) == SQLITE_OK) {// 绑定参数sqlite3_bind_text(statement, 1, name, -1, SQLITE_STATIC);sqlite3_bind_int(statement, 2, age);sqlite3_bind_int(statement, 3, id);// 执行语句if (sqlite3_step(statement) != SQLITE_DONE) {std::cerr << "Error updating data." << std::endl;}else {std::cout << "Data updated." << std::endl;}// 释放资源sqlite3_finalize(statement);}
}// 删除数据
void DeleteData(sqlite3* db, int id) {const char* deleteDataSQL = "DELETE FROM Users WHERE Id=?;";sqlite3_stmt* statement;if (sqlite3_prepare_v2(db, deleteDataSQL, -1, &statement, nullptr) == SQLITE_OK) {// 绑定参数sqlite3_bind_int(statement, 1, id);// 执行语句if (sqlite3_step(statement) != SQLITE_DONE) {std::cerr << "Error deleting data." << std::endl;}else {std::cout << "Data deleted." << std::endl;}// 释放资源sqlite3_finalize(statement);}
}int main() {// 指定数据库文件路径const char* dbFilePath = "test.db";// 创建数据库连接sqlite3* db = OpenDatabase(dbFilePath);if (db) {// 创建表CreateTable(db);// 插入数据InsertData(db, "zhang san", 30);InsertData(db, "li si", 40);InsertData(db, "wang wu", 50);// 查询数据QueryData(db);// 更新数据//UpdateData(db, 1, "Updated Name", 35);查询更新后的数据//QueryData(db);删除数据//DeleteData(db, 1);查询删除后的数据//QueryData(db);// 关闭数据库连接CloseDatabase(db);}return 0;
}
生成文件
正常输出
sqlite的db文件的查看工具
sqliteexpert下载地址
地址:http://www.sqliteexpert.com
使用方法
安装后即可使用,将db文件直接拖进去即可