MFC中使用sqlite3操作数据库 创建、插入、查询、修改、删除数据
需要用到的文件有sqlite3.h 、sqlite3.dll、sqlite3.lib。获取方法可参考https://blog.csdn.net/qinbaby/article/details/83107345 。
将这三个文件拷贝到自己新建MFC项目目录下,在解决方案窗口下 添加现有项,选择sqlite3.h 、sqlite3.dll、sqlite3.lib这三个文件,添加到项目中。
然后在.cpp开头添加#include “sqlite3.h”
一些宏定义:
#define SQL_CREATE_TABLE "Create table if not exists User_info(UserName char(20), Password char(20), Level char(5))" #define SQL_INSERT_DATA "Insert into User_info (UserName, Password, Level) values ('%s', '%s', '%s')" #define SQL_QUERY_DATA "Select * from User_info"
以及自定义管理struct
typedef struct _INFO_ { CString UserName; CString Password; CString Level; }Info;
sqlite3* m_pDB;
1、创建数据库:
int rc; char* err_msg = NULL; sqlite3* m_pDB; rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建 if (rc) { sqlite3_close(m_pDB); //打开失败! MessageBox(_T("数据库打开失败,请检查后再操作!")); return; } if (sqlite3_exec(m_pDB, SQL_CREATE_TABLE, NULL, NULL, &err_msg) != SQLITE_OK) { MessageBox(_T("操作失败,数据库链表生成错误!")); return; } sqlite3_close(m_pDB);
2、插入数据
int rc; char* err_msg = NULL; char sql[256]; rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建 if (rc) { sqlite3_close(m_pDB); //打开失败! MessageBox(_T("数据库打开失败,请检查后再操作!")); return; } USES_CONVERSION; sprintf_s(sql, SQL_INSERT_DATA, W2A(c_UserName), W2A(c_PassWord), W2A(c_Level)); int exit = sqlite3_exec(m_pDB, sql, 0, 0, &err_msg); if (exit != SQLITE_OK) { sqlite3_free(err_msg); sqlite3_close(m_pDB); CString cMessagebox; cMessagebox.Format(_T("用户注册失败,失败原因:%s"), (LPCTSTR)err_msg); return; } sqlite3_close(m_pDB); MessageBox(_T("用户添加成功!"));
3、查询数据,两种方式都可以实现:
方式1:
CString ErrMessage; int rc; char* err_msg = NULL; rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建 if (rc) { sqlite3_close(m_pDB); //打开失败! MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP); return; } sqlite3_stmt* stmt; rc = sqlite3_prepare_v2(m_pDB, SQL_QUERY_DATA, -1, &stmt, 0); if (rc != SQLITE_OK) { sqlite3_finalize(stmt); sqlite3_close(m_pDB); return; } m_List_UserManage.DeleteAllItems(); int m_line = 0; rc = sqlite3_step(stmt); while (rc == SQLITE_ROW) { Info info; info.UserName = sqlite3_column_text(stmt, 0); info.Password = sqlite3_column_text(stmt, 1); info.Level = sqlite3_column_text(stmt, 2); m_List_UserManage.InsertItem(m_line, info.UserName); m_List_UserManage.SetItemText(m_line, 1, info.Password); m_List_UserManage.SetItemText(m_line, 2, info.Level); m_line = m_line + 1; rc = sqlite3_step(stmt); } sqlite3_finalize(stmt); sqlite3_close(m_pDB);
方式2(未验证):
int rc; char * err_msg = NULL; rc = sqlite3_open("myDatabase.db", &m_pDB);// 打开数据库,不存在时创建 if (rc) { sqlite3_close(m_pDB); //打开失败! MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP); return ; } int row=0; int colum=0; char **azResult; CArray<Info> arr; rc=sqlite3_get_table(m_pDB,SQL_QUERY_DATA,&azResult,&row,&colum,&err_msg); for (int i=1; i<row+1; i++) { Info info; info.subject= *(azResult+i*colum+1); info.name= *(azResult+i*colum+2); info.mark= *(azResult+i*colum+3); arr.Add(info); } sqlite3_free_table(azResult); sqlite3_close(m_pDB);
4、修改数据:
//修改数据库 cUserName = DataChangeDlg.c_UserName; cPassWord = DataChangeDlg.c_PassWord; cLevel = DataChangeDlg.c_Level; int rc; char* err_msg = NULL; char sql[256]; rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建 if (rc) { sqlite3_close(m_pDB); //打开失败! MessageBox(_T("数据库打开失败,请检查后再操作!")); return; } USES_CONVERSION; sprintf_s(sql, "UPDATE User_info Set Password='%s' WHERE UserName='%s';", W2A(cPassWord), W2A(cUserName)); rc = sqlite3_exec(m_pDB, sql, NULL, 0, &err_msg); if (rc != SQLITE_OK) { CString cMessagebox; cMessagebox.Format(_T("密码更新失败,失败原因:%s"), (LPCTSTR)err_msg); MessageBox(cMessagebox); sqlite3_free(err_msg); sqlite3_close(m_pDB); return; } sprintf_s(sql, "UPDATE User_info Set Level='%s' WHERE UserName='%s';", W2A(cLevel), W2A(cUserName)); rc = sqlite3_exec(m_pDB, sql, NULL, 0, &err_msg); if (rc != SQLITE_OK) { CString cMessagebox; cMessagebox.Format(_T("用户等级更新失败,失败原因:%s"), (LPCTSTR)err_msg); MessageBox(cMessagebox); sqlite3_free(err_msg); sqlite3_close(m_pDB); return; } MessageBox(_T("用户修改完成!")); sqlite3_close(m_pDB);
5、删除数据:
CString ErrMessage; char sql[256]; int rc; char* err_msg = NULL; rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建 if (rc) { sqlite3_close(m_pDB); //打开失败! MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP); return; } //删除数据 USES_CONVERSION; sprintf_s(sql, "delete from User_info WHERE UserName='%s';", W2A(cUserName)); rc = sqlite3_exec(m_pDB, sql, 0, 0, &err_msg); if (rc != SQLITE_OK) { CString cMessagebox; cMessagebox.Format(_T("删除失败,失败原因:%s"), (LPCTSTR)err_msg); MessageBox(cMessagebox); sqlite3_free(err_msg); return; } MessageBox(_T("该用户已删除!")); sqlite3_close(m_pDB); m_List_UserManage.DeleteItem(nId);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)