天天看点

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

只要一个晚上?信息管理系统?对滴,你没有看错。就是一个晚上。如果你很闲的话,如果你还在无所事事的话,如果你还不懂基于MFC编程的话,请花一个晚上的时间(也可以花更多的时间),认真阅读这篇博客,并肝它。(也热烈欢迎大佬前来围观哦)

文章目录

  • 基本功能介绍
  • 一、建立连接数据库的MFC程序
    • 1.添加数据源
    • 2.建立MFC程序,连接数据库
  • 二、实现基本信息浏览
  • 三、数据库管理-增加、修改、删除
  • 四、数据库查询、排序
  • 五、查看记录集
  • 六、结束语

基本功能介绍

我们先来看看这是一个啥样的学生信息管理系统,它有啥功能。小二,上图!

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

从运行出来的界面我们可以看到,我们需要连接一个数据库,该数据库不仅含有基本学生基本信息,还含有对应图片的路径名。功能1通过点击菜单栏上的上一条记录、下一条记录、第一条记录、最后一条记录来浏览数据库里面的内容及图片。功能2点击放大图片按钮,单击按钮后将弹出一个含有该图片的对话框,如下图:

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

功能3点击增加、修改、删除按钮,向数据库增加、修改、删除记录集,如下图:

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

功能4通过输入查询子句查询数据并显在当前窗口,如下图:

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

当查询出差时会弹出相应的提示框,如下图:

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

功能5我们可以输入需要排序的字段,使记录集按该字段进行排序。(需要在浏览记录集时才能呈现出排序的效果,这里就不截图作参考了)

功能6点击查看记录集按钮查看数据库中的所有记录,如图:

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

这就是一夜之间肝完的学生信息管理系统了,很多人可能觉得这都是些啥啊,这种鸡毛蒜皮的玩意也拿出来分享?好吧,大佬看到这就可直接拉到文末给我点赞或者评论一番啦,觉得这玩意儿还行的朋友们就继续往下阅读哦(超长预警~)认真阅读的朋友们可能发现还有一个恢复的按钮,这又是啥子功能呢。这个吧,其实就是恢复记录集的功能,为什么要恢复呢,因为我们在查询或者排序的时候记录集都会有相应的变化。比如在查询的时候,记录集就会变成你要查询的那些信息,而你不想要的那些记录集就不显示给你看啦,所以我们需要恢复记录集为原来的状态。好了,劈里啪啦介绍了一大堆,我们开始讲怎么做吧。小二,上肉!

一、建立连接数据库的MFC程序

1.添加数据源

首先我们需要建立一个数据库,建立包含学生基本信息的数据库文件,学生信息中有一个字段为学生本人相片的名字+后缀如(小明.jpg),而真正的相片图像文件存在路径所对应的文件夹里;这里是用Access来创建.mdb格式的数据库,然后我们添加数据源,如何添加数据源呢?步骤如下:控制面板>系统和安全>管理工具>ODBC Data Sources(32-bit)>添加>选择。之后就可以选择数据库来添加数据源了

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

2.建立MFC程序,连接数据库

我们是通过在建立MFC程序的向导中连接数据库的,其中在向导里要修改的步骤如下,没有提到的就按默认程序走就好了。

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语
一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

这样我们就可以在MFC程序使用数据库了。

二、实现基本信息浏览

一个新建立起来的连接数据库的MFC程序运行出来只是一个空的对话框,我们需要往这个对话框里添加我们要显示的编辑控件、按钮、以及图片控件。在资源视图里点击对话框资源,打开工具箱,把需要用到的工具拖到对话框的相应位置即可,按钮的话右键点击属性可修改按钮的名字。我们这里是有8个字段需要显示在对话框里,所以就要添加8个编辑控件,在添加编辑控件的时候右键点击添加变量,每个编辑控件都需要有对应的变量,按钮的话就点击右键选择添加事件处理程序,在点击按钮后就可发生相应的事件。在这个过程中,我们还需要添加对话框,右键点击资源视图里的.rc文件后选择添加资源,选择对话框资源,新建,后双击对话框,添加类向导,就可建立一个新的对话框类了,跟前面一样,我们可以在这个新建的对话框里添加相应的控件,如我们需要放大图片,就需要添加一个图片控件,其实也可以不添加,但是为了居中显示且不失真的显示图片,我们还是加上。

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

接下来我们先实现初步的浏览,在视图类中找到**DoDataExchange(CDataExchange* pDX)**这个函数,修改为如下图圈出的最后一列的数据。m_pSet是一个指向当前记录集的指针,后面接的是默认的字段名

一夜之间就能肝完的学生信息管理系统基本功能介绍一、建立连接数据库的MFC程序二、实现基本信息浏览三、数据库管理-增加、修改、删除四、数据库查询、排序五、查看记录集六、结束语

这只是实现了对数据库里记录集的浏览,并没有实现图片的显示,下面我们讲怎么显示图片。因为已经在编辑控件里显示了照片的文件名,我们在加上一个路径就可知道照片的全路径名了,如:

//在视图类定义
CString path;
//初始化
path=_T("这里加上要显示的图片的全路径");
//例如path=(_T("E:\\VC图片\\");
           

接着我们就可以在**Onpain()**函数里画图

void C学生信息管理系统View::OnPaint()
{
	GetDlgItemText(IDC_EDIT8, s);//取得ID为IDC_EDIT8的编辑控件的内容放在字符串s中
	filename = path + s;//获得照片的全路径名 
	draw_pic(filename);//这是一个我自己写的画图的函数,照片名作为参数,调用此函数就可画出图片
	
}
           

用到的画图函数如下(在视图类添加的一个函数,用的时候要记得声明哦):

void C学生信息管理系统View::draw_pic(CString file)
{
	CImage img;
	img.Load(file);//加载图片
	CDC*pDC = GetDlgItem(IDC_STATIC)->GetDC();//获得对话框上图片控件的DC
	int x, y, w, h;
	CRect rect;
	GetDlgItem(IDC_STATIC)->GetClientRect(&rect);

	float rect_ratio = 1.0*rect.Width() / rect.Height();
	float img_ratio = 1.0*img.GetWidth() / img.GetHeight();
	if (rect_ratio > img_ratio)
	{
		h = rect.Height();
		w = img_ratio*h;
		x = (rect.Width() - w) / 2;
		y = 0;
	}
	else
	{
		w = rect.Width();
		h = w / img_ratio;
		x = 0;
		y = (rect.Height() - h) / 2;
	}
	pDC->SetStretchBltMode(HALFTONE);
	img.Draw(pDC->m_hDC, x, y, w, h);//在图片控件上画出图片
	ReleaseDC(pDC);

}
           

这里需要注意的是,我们可以对工具栏上的浏览记录的菜单进行重写,因为有时候我们需要刷新客户区的内容。重写的时候需要用到几个函数:

MoveNext() 移动到下一条记录

MovePrev() 移动到上一条记录

MoveLast() 移动到最后一条记录

MoveFirst() 移动到第一条记录

IsBOF() 用来判断当前记录是否在第一条

IsEOF() 用来判断当前记录是否在最后一条

重写菜单栏上的第一条记录:

void C学生信息管理系统View::OnRecordFirst()
{
	m_pSet->MoveFirst();
	Invalidate();
}
           

重写菜单栏上的下一条记录:

void C学生信息管理系统View::OnRecordNext()
{
	m_pSet->MoveNext();
	if (m_pSet->IsEOF())
		m_pSet->MoveLast();
	Invalidate();

}
           

重写菜单栏上的上一条记录:

void C学生信息管理系统View::OnRecordPrev()
{
	m_pSet->MovePrev();
	if (m_pSet->IsBOF())
		m_pSet->MoveFirst();
	 Invalidate();
	
}
           

重写菜单栏上的最后一条记录:

void C学生信息管理系统View::OnRecordLast()
{
	m_pSet->MoveLast();
	Invalidate();
	
}
           

以上我们已经实现了对基本信息与照片的浏览功能,很简单吧。然后我们来说一下放大照片的功能,其实这个并不难,首先我们添加放大照片的这个按钮,然后添加这个按钮的事件处理程序,如下:

void C学生信息管理系统View::OnBnClickedButton1()//放大照片,弹出对话框
{
	// TODO: 在此添加控件通知处理程序代码
	Mydlg dlg;//放大图片时弹出的对话框
	dlg.name = filename;//该对话框类的一个字符串变量,用来存放照片的路径名
	if (dlg.DoModal() == IDOK)//点击该对话框上的确定按钮,就执行以下操作,这里咱不执行任何操作
	{

	}
	
}
           

因为我们需要弹出对话框,所以得添加一个对话框资源,然后对这个对话框资源进行添加类向导时命名为Mydlg,就有了Mydlg这个对话框类,在这个对话框类里,我们定义一个名为name的字符串变量来获取照片的路径名。然后我们就可以在这个对话框类的Onpait()函数上面绘制图片了。基本操作跟之前直接显示图片时类似,Onpaint()函数里的代码如下:

void Mydlg::OnPaint()
{
	CDC*pDC = GetDlgItem(IDC_STATIC)->GetDC();
	CImage image;
	image.Load(name);
	int x, y, w, h;
	CRect rect;
	GetDlgItem(IDC_STATIC)->GetClientRect(&rect);

	float rect_ratio = 1.0*rect.Width() / rect.Height();
	float img_ratio = 1.0*image.GetWidth() / image.GetHeight();
	if (rect_ratio > img_ratio)
	{
		h = rect.Height();
		w = img_ratio*h;
		x = (rect.Width() - w) / 2;
		y = 0;
	}
	else
	{
		w = rect.Width();
		h = w / img_ratio;
		x = 0;
		y = (rect.Height() - h) / 2;
	}
	pDC->SetStretchBltMode(HALFTONE);
	image.Draw(pDC->m_hDC, x, y, w, h);
	ReleaseDC(pDC);
}
           

三、数据库管理-增加、修改、删除

首先我们需要知道以下几个函数:

AddNew(),Edit(),Delete(),Update() //进入加新、编辑状态,删除、更新

从功能介绍的时候我们就知道,我们是通过点击按钮弹出对话框来实现增加和修改的,这就意味着我们又要添加对话框资源了,来,不着急,我们一步步慢慢来。首先我们先添加增加的对话框资源,因为我们是要对数据库记录集的增加,所以就要在对话框资源里添加编辑控件,因为我们这里的数据库一个由8个有效字段,所以我们添加8个编辑控件,分别给这些编辑控件添加相应的变量。添加对增加按钮的事件处理程序,如下:

void C学生信息管理系统View::OnBnClickedAdd()//增加
{
	// TODO: 在此添加控件通知处理程序代码
	MyAddDlg dlg;//需要显示的对话框
	int r = dlg.DoModal();
	if (r == IDOK)
	{   
		
		m_pSet->AddNew();//进入增加状态
		m_pSet->column1 = dlg.a;//将对话框上编辑控件的变量a放到记录集相应的字段
		m_pSet->column2 = dlg.b;
		m_pSet->column3 = dlg.c;
		m_pSet->column4 = dlg.d;
		m_pSet->column5 = dlg.e;
		m_pSet->column6 = dlg.f;
		m_pSet->column7 = dlg.g;
		m_pSet->column8 = dlg.h;
		m_pSet->Update();//更新记录集
		UpdateData(false);
	}
}
           

类似的,我们对修改按钮添加事件处理程序,与增加不同的是,我们需要把要修改的记录集信息显示到修改对话框上,如下:

void C学生信息管理系统View::OnBnClickedButton3()//修改
{
	// TODO: 在此添加控件通知处理程序代码
	
	CString s1, s2, s3, s4, s5, s6, s7, s8;
	GetDlgItemText(IDC_EDIT1, s1);//获取编辑控件ID为IDC_EDIT1的信息存放在s1中,以便显示在修改的对话框上,以下类似
	GetDlgItemText(IDC_EDIT2, s2);
	GetDlgItemText(IDC_EDIT3, s3);
	GetDlgItemText(IDC_EDIT4, s4);
	GetDlgItemText(IDC_EDIT5, s5);
	GetDlgItemText(IDC_EDIT6, s6);
	GetDlgItemText(IDC_EDIT7, s7);
	GetDlgItemText(IDC_EDIT8, s8);
	MyChangeDlg mydlg;//修改对话框
	mydlg.a = s1;//将s1显示在对话框的编辑控件上,以下类似
	mydlg.b = s2;
	mydlg.c = s3;
	mydlg.d = s4;
	mydlg.e = s5;
	mydlg.f = s6;
	mydlg.g = s7;
	mydlg.h = s8;
	int r = mydlg.DoModal();
	if (r == IDOK)
	{
		m_pSet->Edit();
		m_pSet->column1 = mydlg.a;//获取对话框编辑控件上的信息,传给记录集中相应的字段
		m_pSet->column2 = mydlg.b;
		m_pSet->column3 = mydlg.c;
		m_pSet->column4 = mydlg.d;
		m_pSet->column5 = mydlg.e;
		m_pSet->column6 = mydlg.f;
		m_pSet->column7 = mydlg.g;
		m_pSet->column8 = mydlg.h;
		m_pSet->Update();
		UpdateData(false);
	}
}

           

删除功能的实现与增加和修改不同,它不需要弹出对话框对数据进行处理,它只需要从记录集里删除当前记录,同样的是这里也是要对删除按钮添加事件处理程序,通过事件处理程序里的操作来进行删除记录,如下:

void C学生信息管理系统View::OnBnClickedDelete()//删除
{
	// TODO: 在此添加控件通知处理程序代码
	m_pSet->Delete();//删除当前记录集
	m_pSet->MovePrev();//将当前记录集移到上一条
	if (m_pSet->IsBOF())//如果在删除前当前记录集是第一条
		m_pSet->MoveFirst();//将记录集移动到删除后的第一条记录集
	UpdateData(false);
}

           

以上就可以实现了增加、修改、删除的功能了。番外1:写到这里好累哦,不晓得有没有人仔细看。。。还是得继续写的。

四、数据库查询、排序

我们先来认识一下简单的SQL语句:

SELECT * FROM 学生信息表 WHERE 姓名 = ‘张三’

WHER后的 " 姓名 = ‘张三’ ”称为where子句

SELECT * FROM 学生信息表 ORDER BY 姓名 DESC

ORDER BY后的 “姓名 DESC” 称为order by子句

接着我们来介绍一下m_strFilter和m_strSort的作用

把WHRER子句赋值给数据集数据成员m_strFilter,即能把满足查询条件的记录提取出来放入记录集, 如果m_strFilter=_T("")后再Requery(),则能恢复到默认的记录集
把 ORDER BY子句赋值给数据集数据成员m_strSort, 然后执行Requery(),即能按排序要求把记录提取出来放入记录集

简单的说m_strFilter是用于指定过滤器,m_strFilter实际上包含了SQL的WHERE子句的内容,但它不含WHERE关键字,例如:

m_pSet->m_strFilter="学号='2018123001'"; 
//只选择学号为2018123001的记录,其中学号为数据库的字段名
           

m_strSort用于指定排序,m_strSort实际上包含了ORDER BY子句的内容,但它不含ORDER BY关键字,例如:

m_pSet->m_strSort=" 学号 DESC"; 
//按学号的降序排列记录,其中学号为字段名
           

知道m_strFilter和m_strSort的作用之后我们就可以进行选择和排序了,我们需要在一个编辑控件输入需要选择或者排序的条件,后点击按钮发生相应的事件处理程序,例如查询的事件处理程序如下:

void C学生信息管理系统View::OnBnClickedButton2()//查询
{
	
	UpdateData();
	checksno.TrimLeft();
//checksno是记录查询条件的编辑控件关联的一个变量,这里是的作用是去掉字符串前面的空格
	if (checksno.IsEmpty())
	{
		MessageBox(_T("请输入需要查询的信息!")); return;
	}
	if (m_pSet->IsOpen())//如果记录集打开
		m_pSet->Close();//就先关闭记录集
	m_pSet->m_strFilter.Format(checksno);//按checksno查询条件进行查询
//在编辑控件输入的格式为:学号>='2018123002'
	m_pSet->m_strSort = "学号";//将查询结果按学号默认排序,默认为升序
	//m_pSet->Requery();
	m_pSet->Open();//打开记录集
	if (!m_pSet->IsEOF())
	{
		Invalidate();
	    UpdateData(FALSE);//更新
	}
		
	else MessageBox(_T("没有你要找的信息记录!"));
	
}

           

对排序的事件处理程序如下:

void C学生信息管理系统View::OnBnClickedButton5()//排序
{
	
	UpdateData();
	sort.TrimLeft();//sort为记录排序条件的编辑控件关联的变量
	if (sort.IsEmpty())
	{
		MessageBox(_T("请输入需要排序的信息!")); return;
	}
	if (m_pSet->IsOpen())
		m_pSet->Close();
	m_pSet->m_strSort.Format(sort);//按sort这个排序条件进行排序
	m_pSet->Open();
	if (!m_pSet->IsEOF()) {
		Invalidate();
		UpdateData(FALSE);
	}

	else MessageBox(_T("请输入正确的信息!"));
}

           

在实现了查询和排序之后如果要恢复记录集可使用**Requery()**来恢复到默认的记录集,我这里是通过点击按钮添加按钮事件处理程序来进行恢复。

五、查看记录集

番外2:终于到了最后一个功能了,还有人在看吗。。。我已经在怀疑人生了,点赞或者评论区留言给我点鼓励好不好…好,我们直接来看实现这个功能需要用的函数:

GetODBCFieldCount( )——获取字段数目

MoveFirst(), MoveNext(), IsEOF() ——控制while循环

GetFieldValue((short)n,str)——读取当前记录的第n个字段,放入字符串str

我们是在通过添加按钮事件处理程序来显示记录集信息的,因为需要弹出对话框来显示,在这里我们又需要添加对话框资源了,我们可以通过在对话框资源添加编辑控件来显示记录集,也可以添加List Box来显示,我这里使用的是List Box,因为List Box是一行一行添加的,如果我们需要在List Box添加东西,就要在该对话框上重写OnInitDialog()函数,在这个函数里边添加要添加的内容,例如:

BOOL LookMDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	for (int i = 0; i < str0.GetSize(); i++) {//str0.GetSize()表示字符串数组str0的长度
		Lbox.AddString(str0[i]);//向列表框里添加str0的内容,且是一行一行添加
	}

	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

           

其中这里的str0是该对话框类上定义的一个字符串数组,定义字符串数组使用的是关键字CStringArray,这个字符串数组用来存放每一条记录集,然后依次添加到List Box上显示。那么问题来了,我们怎么获得记录集呢,字符串数组str0里面的内容从哪里来呢。前面我们有介绍获得当前字段的一个函数,通过获得全部字段来获得一个完整的记录集。这些操作我们是通过在显示记录集这个按钮的事件处理程序来实现的,如下:

void C学生信息管理系统View::OnBnClickedButton6()//查看记录集
{
	LookMDlg dlg;//显示记录集的对话框
	CStringArray str;//定义字符串数组str
	
	m_pSet->MoveFirst();
	while (!m_pSet->IsEOF())
	{
		CString str1;
   for (int i = 1; i <= m_pSet->GetODBCFieldCount() - 1; i++)
//GetODBCFieldCount()是获得数据库中的字段数目
		{
	     CString str0;
			m_pSet->GetFieldValue((short)i, str0);//获取字段i的内容存放在str0里
			str1 += str0;//将当前记录的每个字段累加记录到str1中
			
		}str.Add(str1);//把记录有当前记录的字段集str1存放在字符串数组str中
		m_pSet->MoveNext();//将记录集指针指向下一条记录
	}
		
	for (int j = 0; j < str.GetSize(); j++)
	{
		dlg.str0.Add(str[j]);
}
//将字符串数组str中存放的数据放到与显示记录集对话框上的一个字符数组上
//也就是在这里给显示记录集对话框的字符串数组赋值
//前面问到str0的内容从哪里来,就是从这里来的
	
	if (dlg.DoModal())
	{

	}
}

           

好了,看到这里基本功能都实现了。

六、结束语

你看懂了吗?不对,我应该问你还在看吗?你能看到这里我已经很欣慰了呢,但是我更希望我的读者们能从中收获知识呢。番外3:先来做一个自我检讨吧,可能选择这个话题来发布这篇博文就已经是一个错误了,因为在写的过程中有一些细节没能仔细跟大家展开来讲,再加上自己水平有限,在写的过程中可能会出现某些小错误,在此希望读者积极揭发我的错误,我很乐意去面对自己的错误并改正,也谢谢读者们的海涵。如果有读者对此感兴趣并想了解更多的可以私聊我呢,期待大家的点赞与评论。点个赞or评个论给本大学生一点鼓励吧!非常感谢大家的支持!