法一:用官网编译好的动态库(推荐)
下载所需文件
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相关文件的文件夹
- 接着输入
bash
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源代码
2)VS2022命令行操作
1.进入源代码目录
2.设置环境变量
bash
set TCLDIR=C:\Tcl
3.编译sqlite生成所需库
bash
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交互测试代码
测试代码
bash
//#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文件直接拖进去即可