【MFC】vs2019中使用sqlite3完成学生管理系统

news2025/1/9 17:14:09

目录

  • 效果图
  • list Contral 控件的简单使用
  • 使用sqlite3

效果图

在这里插入图片描述
使用sqlite3完成简单的数据库操作。

list Contral 控件的简单使用

本章只介绍基本应用

	添加表头:

语法

int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);

nCol:表示列
lpszColumnHeading:表示常量字符串指针
nFormat:表示样式,LVCFMT_LEFT(左对齐)
nWidth:列宽度
nSubItem:指定列对应的子项索引,默认值-1

使用:
//设置样式
m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_listCtrl.InsertColumn(0, _T("学号"), LVCFMT_LEFT, 80);
m_listCtrl.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 80);
m_listCtrl.InsertColumn(2, _T("年龄"), LVCFMT_LEFT, 80);
m_listCtrl.InsertColumn(3, _T("成绩"), LVCFMT_LEFT, 80);
	添加子项

语法

int InsertItem(int nItem, LPCTSTR lpszItem);
bool SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);

nItem:索引 行,默认-1会插到末尾
nSubItem:索引 列
lpszItem:常量字符串指针

使用:
InsertItem(i, _T(""));
SetItemText(i, j, str);
	清空列表
DeleteAllItems();
这个函数没有参数,它会直接删除CListCtrl控件中的所有项目。
当调用这个函数后,列表视图将变为空的状态,之前所有插入的行都将被清除。

使用sqlite3

环境:vs2019
使用sqlite3主要是通过以下函数

语法:sqlite3_open

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

作用:打开或者创建一个数据库
filename: 路径 。如果不存在则创建数据库
ppDb: 指向sqlite3 类型指针的指针。创建成功后会指向一个sqlite3 对象,通过这个对象对数据库进行操作

使用:
	sqlite3* db=NULL;
	int rc = sqlite3_open("./db/text.db", &db);
	if (rc != SQLITE_OK)
	{
		AfxMessageBox(_T("链接数据库失败"));
		return;
	}

int sqlite3_close(sqlite3*);

作用:关闭数据库
使用:
	sqlite3_close(db);

语法:sqlite3_exec


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

sql: 需要执行的sql语句

参数三: 回调函数,看这个回调函数的参数类型,不难猜出,这个函数
是用来处理查询语句(select)的结果的。如果不是查询语句,设置NULL即可

arg是sqlite3_exec函数的arg参数传递过来的值;
nCol是查询结果中的列数;
colVal是一个指向字符数组的指针,用于存储每一列的值;
colName是一个指向字符数组的指针,用于存储每一列的名称。

arg:这是一个void类型的指针,用于传递给回调函数的额外参数。

可以是任何类型的数据,通过这个参数可以在回调函数中获取外部传递进来的信息。
errmsg: 用来存储错误信息的,执行成功会被设置NULL,失败会有错误信息

使用:
	const std::string str = "CREATE TABLE IF NOT EXISTS Students("
				"id TEXT PRIMARY KEY,"
				"name TEXT,"
				"age INTEGER,"
				"grades REAL);";

	sqlite3_exec(db, str.c_str(), NULL, NULL, NULL);
	if (rc != SQLITE_OK) {
		AfxMessageBox(_T("创建表失败"));
		return;
	}

语法:sqlite3_get_table

int sqlite3_get_table(sqlite3* db, const char* zSql, 
	char*** pazResult, int* pnRow, int* pnColumn, 
	char** pzErrmsg);
	
作用: 和sqlite3_exec的回调函数相似

pazResult: 存放的是查询后的结果集
pnRow: 行
pnColumn: 列

使用:
	char** mResult;//结果集
	int mRow;//行数
	int mCol;//列数
	int nResult = sqlite3_get_table(Cdb.db, sql, &mResult, &mRow, &mCol, NULL);
	int nIndex = mCol;
	if (nResult == SQLITE_OK)
	{
		for (int i = 0; i < mRow; i++)
		{
			m_listCtrl.InsertItem(i, _T(""));
			for (int j = 0; j < mCol; j++)
			{
				CString str;
				str = mResult[nIndex];

				if (!strcmp("id", mResult[j]))
				{
					m_listCtrl.SetItemText(i, j, str);
				}
				else if (!strcmp("name", mResult[j]))
				{
					m_listCtrl.SetItemText(i, j, str);
				}
				else if (!strcmp("age", mResult[j]))
				{
					m_listCtrl.SetItemText(i, j, str);
				}
				else if (!strcmp("grades", mResult[j]))
				{
					m_listCtrl.SetItemText(i, j, str);
				}
				nIndex++;
			}
		}

要深刻理解mResult 才可以理解代码

配套使用的还有
void sqlite3_free_table(char **result);
用来释放存储结果集的空间,防止内存泄漏

使用:
	sqlite3_free_table(mResult);

语法:sqlite3_prepare_v2

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

nByte:表示sql字符的长度,通常设置-1,编辑器自动计算长度
ppStmt:这是一个指向sqlite3_stmt类型指针的指针。
用于存储预处理后的 SQL 语句对象。
在成功预处理 SQL 语句后,*ppStmt会指向一个有效的sqlite3_stmt对象,
这个对象在后续的sqlite3_step函数执行过程中会被使用。
pzTail:通常设置NULL


int sqlite3_step(sqlite3_stmt *pStmt);
返回值:SQLITE_DONE:表示非查询语句已经成功执行完毕。
例如,插入一条记录成功、更新或删除指定数据成功后,都会返回SQLITE_DONE。
SQLITE_ERROR:错误
SQLITE_NOMEM:内存不足
SQLITE_ROW:用于查询,当返回这个说明还没有执行完

配套使用的还有
int sqlite3_finalize(sqlite3_stmt *pStmt);
释放存放sql语句的内存

使用:
	sqlite3_stmt* stmt = NULL;        //stmt语句句柄
	int result = sqlite3_prepare_v2(Cdb.db, sql, -1, &stmt, NULL);
	if (result == SQLITE_OK)
	{
		int stepResult = sqlite3_step(stmt);
		if (stepResult == SQLITE_DONE)
		{
			AfxMessageBox(_T("删除成功"));
			OnBnClickedButton1();
		}
		else
		{
			AfxMessageBox(_T("执行 SQL 语句失败"));
		}
	}
	else
	{
		AfxMessageBox(_T("准备 SQL 语句失败"));
	}

	if (stmt != NULL)
	{
		sqlite3_finalize(stmt);
	}

SQLite 库中一个用于将 SQL 语句编译为字节码程序的函数,它是执行 SQL 语句(特别是那些带有参数或者需要更精细控制执行过程的语句)的重要前置步骤。通过这个函数,可以对 SQL 语句进行预处理,之后可以使用sqlite3_step函数来逐步执行预处理后的语句。这种方式比直接使用sqlite3_exec函数更灵活,适用于复杂的数据库操作,如带有参数绑定的插入、更新、删除操作以及需要逐行处理的查询操作等。

sqlite3_step,用于执行在sqlite3_prepare_v2中已经准备好的 SQL 语句的下一个步骤。对于查询语句,它会逐行获取结果;对于非查询语句(如插入、更新、删除),它会执行语句直到完成相应的操作。

语法:sqlite3_bind_text
再使用sqlite3_prepare_v2执行相对复杂的语句时,需要用到占位符
sqlite3_bind_text函数是用来替换占位符的

下面是修改操作

	sqlite3_stmt* stmt = NULL;        //stmt语句句柄
	const char* str = "update Students set name = ?, age = ?,grades = ? where id=?;";
	int result = sqlite3_prepare_v2(Cdb.db, str, -1, &stmt, NULL);
	if (result == SQLITE_OK)
	{
		std::string id = (CT2A(m_strId));
		std::string name = (CT2A(m_strName));
		sqlite3_bind_text(stmt, 1, name.c_str(), -1, SQLITE_TRANSIENT);
		sqlite3_bind_int(stmt, 2, m_strAge);
		sqlite3_bind_double(stmt, 3, m_iGrades);
		sqlite3_bind_text(stmt, 4, id.c_str(), -1, SQLITE_TRANSIENT);
		int stepResult = sqlite3_step(stmt);
		if (stepResult == SQLITE_DONE)
		{
			AfxMessageBox(_T("修改成功"));
		}
		else
		{
			AfxMessageBox(_T("执行 SQL 语句失败"));
		}
	}
	else
	{
		AfxMessageBox(_T("准备 SQL 语句失败"));
	}

	if (stmt != NULL)
	{
		sqlite3_finalize(stmt);
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式 —— 【创建型模式】建造者模式详解

文章目录 一、建造者模式二、案例实现三、优缺点四、模式拓展五、对比1、工厂方法模式VS建造者模式2、抽象工厂模式VS建造者模式 一、建造者模式 建造者模式&#xff08;Builder Pattern&#xff09; 又叫生成器模式&#xff0c;是一种对象构建模式。它可以将复杂对象的建造过…

单链表(C语言版本)

前提 不探讨头结点空链表可以插入和查找&#xff0c;不可删除一般不选择phead移动&#xff0c;定义一个新结点把phead赋给他&#xff0c;移动新结点即可单链表不适合在前面和后面插入或删除&#xff0c;适合在后面插入删除 头插 void SLPushFront(SLTNode** pphead, SLTDataTy…

VMware虚拟机搭建和镜像配置

VMware虚拟机搭建和镜像配置 下载安装VMware 开始下载 更改安装路径&#xff0c;需要一个大空间的盘 更改后下一步 下一步后&#xff0c;选择不主动升级更新 一直下一步 直到安装完毕 输入许可密钥&#xff0c;我下载的版本是12&#xff0c;输入完成点击输入&#xff…

使用PPT科研绘图导出PDF边缘留白问题解决方案

使用PPT画图导出PDF格式后&#xff0c;边缘有空白&#xff0c;插入latex不美观&#xff0c;解决方案为自定义PPT幻灯片母版大小&#xff0c;如题步骤为&#xff1a; 1、查看已制作好的图片的大小&#xff0c;即长度和宽度 2、选择自定义幻灯片大小 3、自定义幻灯片大小为第1…

在Ubuntu上使用docker compose安装N卡GPU的Ollama服务

在现代计算环境中,利用 GPU 进行计算加速变得越来越重要。下面将讲解如何在Ubuntu上使用docker compose安装N卡GPU的Ollama服务。 1、安装 NVIDIA 容器工具 首先,需要确保你的系统已经安装了 NVIDIA 容器工具 nvidia-container-toolkit。这是让 Docker 容器访问 GPU 的关键…

如何借助前端表格控件实现金融投资分析平台?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 金融投资分析背景介绍 金融投资分析是金融领域的核心活动&#xff0c;它要求对资产、市场及经济数据进行深入研究&#xff0c;以识别并评估潜在的投资机会与风险。这一过程融合了宏观经…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…

Python:import语句的详细解析(绝对路径导入和相对路径导入)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 import语句是Python中一个很重要的机制&#xff0c;允许在一个文件中访问另一个文件的函数、类、变量等&#xff0c;本文就将进行详细介绍。 在具体谈论import语句前&a…

CUDA 计时功能,记录GPU程序/函数耗时,cudaEventCreate,cudaEventRecord,cudaEventElapsedTime

为了测试GPU函数的耗时&#xff0c;可以使用 CUDA 提供的计时功能&#xff1a;cudaEventCreate, cudaEventRecord, 和 cudaEventElapsedTime。这些函数可以帮助你测量某个 CUDA 操作&#xff08;如设置设备&#xff09;所花费的时间。 一、记录耗时案例 以下是一个示例程序&a…

数字图像处理(15):图像平移

&#xff08;1&#xff09;图像平移的基本原理&#xff1a;计算每个像素点的移动向量&#xff0c;并将这些像素按照指定的方向和距离进行移动。 &#xff08;2&#xff09;平移向量包括水平和垂直分量&#xff0c;可以表示为&#xff08;dx&#xff0c;dy&#xff09;&#xff…

Hyper-V安装Win11虚拟机并设置vGPU显卡直通

一、为什么我使用Hyper-V虚拟机 我的宿主机是Win11,想装一个Win10或Win11虚拟机。但是我用VMware安装Win10或Win11后,随机地蓝屏,非常烦人,估计是和宿主机的某些设置有关,或者宿主机电脑硬件比较新(我电脑装Win10就会蓝屏,Win11就不会),某些特性不支持。 所以我就安…

Qt Xlsx安装教程

Qt Xlsx安装教程 安装perl 如果没有安装perl&#xff0c;请参考perl Window安装教程 下载QtXlsxWriter源码 下载地址 ming32-make编译32 lib库 C:\Qt\Qt5.12.12\5.12.12\mingw73_32>d: D:\>cd D:\Code\QtXlsxWriter-master\QtXlsxWriter-master D:\Code\QtXlsxWrit…

C# RSA加密和解密,RSA生成私钥和公钥

C# RSA加密和解密&#xff0c;RSA生成私钥和公钥&#xff08;使用XML格式秘钥&#xff09; 目录 前言生成xml格式的公钥和私钥 PrivateKeyPublicKey测试加密、解密 方案1&#xff1a;RSA公钥加密&#xff0c;RSA私钥解密方案2&#xff1a;RSA私钥加密&#xff0c;RSA私钥解密…

【Rive】Android与Rive交互

1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationViewandroid:id"id/rive_view"android:layout_width"match_parent"android:layout_height"match_parent"android:adjustViewBounds"…

捷米特 EtherNet/IP 总线协议网关的具体内容介绍

关于EtherNET/IP的基本介绍 EtherNet/IP 中的 “Ethernet” 指以太网&#xff0c;是一种常见的局域网技术&#xff0c;用于在有限区域内实现多台设备之间的数据传输&#xff1b;“IP” 在此处指工业协议&#xff08;Industrial Protocol&#xff09;&#xff0c;而不是通常所说…

Python 读取 Excel 表格并导出为 DBF 文件

以下是将上述代码封装为函数的版本。函数接收 input_excel_path、sheet_name 和 output_dbf_path 作为参数&#xff0c;按照需求读取 Excel 表格并导出为 DBF 文件。 封装函数代码 import pandas as pd import dbfdef excel_to_dbf(input_excel_path, sheet_name, output_dbf_…

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

我们发布了一个应用程序&#xff0c;该应用程序运行在一个相当隐蔽的 WAF 后面。他们向我们保证&#xff0c;他们的产品不会以任何方式干扰我们的应用程序。这是错误的。他们删除了我们几乎所有的“自定义”标头。为了“证明”这一点&#xff0c;我构建了一个中间件&#xff0c…

EasyExcel改名为FastExce做了那些改变呢

回到&#xff1a;github原作者地址&#xff1a;https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职&#xff0c;近期阿里宣布停止更新 EasyExcel&#xff0c;作者他本人决定继…

TCP/IP协议详解(小白)

TCP/IP协议详解 TCP/IP协议包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff08;TCP/IP Protocol Suite&#xff0c;或TCP/IP Protocols&#xff09;&#xff0c;简称TCP/IP。TCP/IP协议族提供了点对点的连结机制&#xff0c;并且将传输数据帧的封装、寻址、传输、路由…