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

目录

  • 效果图
  • 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);
	}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…

Android 逆向/反编译/Hook修改应用行为 基础实现

前言&#xff1a;本文通过一个简单的情景案例实现安卓逆向的基本操作 一、情景描述 本文通过一个简单的情景案例来实现安卓逆向的基本操作。在这个案例中所使用的项目程序是我自己的Demo程序&#xff0c;不会造成任何的财产侵害&#xff0c;本文仅作为日常记录及案例分享。实…

OSCP - Proving Grounds - Zino

主要知识点 SMB知识python脚本提权 具体步骤 执行nmap Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-10 01:24 UTC Nmap scan report for 192.168.52.64 Host is up (0.00077s latency). Not shown: 65529 filtered tcp ports (no-response) PORT STATE SER…

VLA模型

目录 引言1. 机器人大模型面临的挑战2. 目前的数据集2.1 RT-12.2 Open X-Embedding2.3 DROID 3. 目前的VLA模型3.1 Goat3.2 RT-13.2.1 总体架构3.2.2 效果 3.3 RT-23.3.1 总体架构3.3.2 效果 3.4 RT-X3.4.1 模型效果1). RT-1-X2). RT-2-X 3.5 RT-H3.5.1 总体架构3.5.2 效果 3.6…

aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3

aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容&#xff1a; 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合&#xff0c…

如何使用Java编写Jmeter函数

Jmeter 自带有各种功能丰富的函数&#xff0c;可以帮助我们进行测试&#xff0c;但有时候提供的这些函数并不能满足我们的要求&#xff0c;这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时&#xff0c;有时候需要填入当前的时间&#xff0c;虽然我们可以使用p…

实战指南:如何通过WBS提高项目估算准确性?

通过WBS将复杂任务细分为更易管理的任务&#xff0c;这有助于明确每项工作范围、所需资源及时间&#xff0c;从而减少估算误差&#xff0c;制定更现实的预算和时间表&#xff0c;提升团队协作效率。如果没有通过WBS将任务细化&#xff0c;项目范围可能变得模糊不清&#xff0c;…

ECharts实战教程:如何生成动态水波纹效果

导语&#xff1a;在数据可视化领域&#xff0c;ECharts是一款非常强大的图表库。今天&#xff0c;我们将带领大家学习如何使用ECharts生成动态水波纹效果&#xff0c;让我们的图表更加生动有趣。 一、准备工作 首先&#xff0c;我们需要准备一些基础数据&#xff0c;如下所示&…

详解:HTTP/HTTPS协议

HTTP协议 一.HTTP是什么 HTTP&#xff0c;全称超文本传输协议&#xff0c;是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP往往是基于传输层TCP协议实现的&#xff0c;采用的一问一答的模式&#xff0c;即发一个请求&#xff0c;返回一个响应。 Q&#xff1a;什…

(0基础保姆教程)-JavaEE开课啦!--13课程(Interception拦截器)-完结

一、Interception(拦截器)是什么&#xff1f; 拦截器&#xff08;Interceptor&#xff09;是一种用于在请求到达目标方法之前或之后执行特定逻辑的机制。它是基于Java反射机制&#xff0c;属于面向切面编程&#xff08;AOP&#xff09;的一种应用。拦截器可以用于多种应用场景&…

vue 封装全局过滤器

1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…

Flask返回中文Unicode编码(乱码)解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

VMware:安装centos网络信息不可用

我们今天要处理的就是在vmware中安装centos出现网络不可用&#xff0c;导致无法安装系统的问题直接上图&#xff0c;我们在主机直接 cmdipconfig 发现IPV4地址都不一样&#xff0c;导致我们无法ping通虚拟机 那我们如何解决呢~~~~ 打开自己VM【编辑】【虚拟网络编辑器】【更…

MperReduce学习笔记下

自定义InputFormat合并小文件 案例需求 无论hdfs还是mapreduce&#xff0c;对于小文件都有损效率&#xff0c;实践中&#xff0c;又难免面临处理大量小文件的场景&#xff0c;此时&#xff0c;就需要有相应解决方案。 案例分析 小文件的优化无非以下几种方式&#xff1a; …

【MySQL 探索者日志 】第二弹 —— 数据库基础

MySQL系列学习笔记&#xff1a; MySQL探索者日志__Zwy的博客-CSDN博客 各位于晏&#xff0c;亦菲们&#xff0c;请点赞关注&#xff01; 我的个人主页&#xff1a; _Zwy-CSDN博客 目录 1、MySQL服务器&#xff0c;数据库&#xff0c;表关系 2、MySQL登录连接服务器 3、MyS…

flink终止提交给yarn的任务

接上文&#xff1a;一文说清flink从编码到部署上线 1.查看正在执行的flink 访问地址&#xff08;参考&#xff09;&#xff1a;http://10.86.97.191:8099/cluster/apps 2.终止任务 yarn application -kill appID 本文为&#xff1a; yarn application -kill application_17…

CentOS虚拟机开机出现问题

CentOS虚拟机断电或强制关机&#xff0c;再开机出现问题 错误原因&#xff1a; failed to mount /sysroot.&#xff08;无法挂载/ sysroot。&#xff09; Dependency failed for Initrd root File System.&#xff08;Initrd根文件系统的依赖关系失败。&#xff09; Dependency…

可靠的人形探测,未完待续(I)

HI&#xff0c;there&#xff01;从紧张的项目中出来冒个泡&#xff01; 刚好想要验证一下mmWave在有人检测方面的应用&#xff0c;就看到了这个活动 - 瞌睡了有枕头属于是&#xff0c;活动策划好评&#xff01; 朋友曾关注汽车相关的技术领域&#xff0c;跟我吐槽过&#xff0…

web斗地主游戏实现指北

前后端通信 作为一个即时多人游戏&#xff0c;不论是即时聊天还是更新玩家状态&#xff0c;都需要服务端有主动推送功能&#xff0c;或者客户端轮询。轮询的时间间隔可能导致游玩体验差&#xff0c;因为不即时更新&#xff0c;而且请求数量太多可能会打崩服务器。 建议在cs间…

基于Qt的文字处理软件(二)

这期文章我们进行主窗口的一些函数的定义&#xff0c;同时导入一些文字处理软件的状态栏会用到的图标。下面图片是图标导入到项目后的一个示例&#xff0c;图标可以到阿里矢量图标库里面找到。 一、导入图标资源: 1.首先在项目目录的位置创建一个images的文件,然后将收集好的图…