去官网(SQLite Download Page)下载相应的源码及动态库文件,如下图所示:
解压分别得到如下文件:
在VS安装目录下(我的是D:\vs\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64)找到以下文件拷贝至sqlite-dll-win64-x64文件夹下,
打开dos界面,目录打开至上述文件夹下输入:
LIB /MACHINE:IX86 /DEF:sqlite3.def
看到文件夹下生成了.lib文件,至此i,所需的.c,.h,.lib,.dll文件已集全;
项目右键-属性-链接器(配置改为DEBUG)-常规-附加库目录中,把.h文件所在路径放上去;
链接器(配置改为DEBUG)-输入-附加依赖项中加入sqlite3.lib,
至此,完成了sqlite3环境的搭建。
将sqlite3.h,sqlite3ext.h,sqlite3.c以及sqlite3.lib和sqlite3.dll文件拷贝至测试项目下,按照前文1.3所述在vs项目属性中完成项目属性设置;
分别添加响应头文件和源文件至项目中;
函数中添加头文件并引入lib文件;
#include "sqlite3.h"
#pragma comment(lib, "sqlite3.lib")
// 数据库打开
sqlite3* sql = NULL; // 一个打开的数据库实例
const char* path = "data.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::cout << "打开数据库连接成功" << endl;;
}
else {
std::cout << "打开数据库连接失败" << endl;
}
// 创建表
const char* sqlCreatetable = "CREATE TABLE exam(name TEXT PRIMARY KEY NOT NULL, score1 INTEGER, score2 INTEGER);";
sqlite3_stmt* stmt = NULL; //stmt语句句柄
result = sqlite3_prepare_v2(sql, sqlCreatetable, -1, &stmt, NULL);
if (result == SQLITE_OK) {
std::clog << "创建数据表成功" << endl;
//执行该语句
sqlite3_step(stmt);
}
else {
std::clog << "创建数据表失败" << endl;
}
//清理语句句柄,准备执行下一个语句
sqlite3_finalize(stmt);
// 表单中插入信息
const char* sqlSentence = "INSERT INTO exam(name, score1, score2) VALUES('xiaohua', 90, 100); ";
//进行插入前的准备工作——检查语句合法性
//-1代表系统会自动计算SQL语句的长度
result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
if (result == SQLITE_OK) {
std::clog << "添加数据语句OK" << endl;
//执行该语句
sqlite3_step(stmt);
}
else {
std::clog << "添加数据语句有问题" << endl;
}
sqlSentence = "INSERT INTO exam(name, score1, score2) VALUES('xiaogang', 20, 10); ";
result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
sqlite3_step(stmt);
//清理语句句柄,准备执行下一个语句
sqlite3_finalize(stmt);
// 查询
char* errmsg;
char** mResult;//结果集
int mRow;//行数
int mCol;//列数
int nResult = sqlite3_get_table(sql, "select * from exam;", &mResult, &mRow, &mCol, &errmsg);
int nIndex = mCol;
cout << "mRow: " << mRow << endl;
cout << "mCol: " << mCol << endl;
if (mRow > 0 && mCol > 0)
{
student stu;
for (int i = 0; i < mRow; i++)
{
for (int j = 0; j < mCol; j++)
{
if (!strcmp("name", mResult[j]))
{
stu.name = mResult[nIndex];
cout << "name=" << stu.name << endl;
}
else if (!strcmp("score1", mResult[j]))
{
stu.score1 = atoi(mResult[nIndex]);
cout << "score1=" << stu.score1 << endl;
}
else if (!strcmp("score2", mResult[j]))
{
stu.score2 = atoi(mResult[nIndex]);
cout << "score2=" << stu.score2 << endl;
}
++nIndex;
}
}
//使用完 sqlite3_get_table 后务必释放为记录分配的内存,否则会内存泄漏
sqlite3_free_table(mResult);
}
至此,初步了解了c++下sqlite的常见读写操作(python真香,只需一句import);
参照:
win10下使用VS2019调用sqlite3环境搭建_跑不了的你的博客-CSDN博客
本地数据库 sqlite3 编译和使用_跑不了的你的博客-CSDN博客
sqlite c++简单demo(win10 vs2019)_山水一的博客-CSDN博客