MFC链接SQL Server ——学生成绩管理系统

MFC链接SQL Server ——学生成绩管理系统

连接数据库

MFC链接SQL Server ——学生成绩管理系统_第1张图片
新建一个udl文件,服务器名称与SQL Server服务器保持一致。选择相应的数据库,测试连接。
(先建好数据库)
MFC链接SQL Server ——学生成绩管理系统_第2张图片
将udl文件改成txt文件。
打开该文件,第3行为SQL Server数据库连接字符串。
在这里插入图片描述

在MFC项目中添加连接代码

新建基于对话框的MFC应用程序项目,按学号命名。
在电脑查找msado15.dll的路径,例如:C:\Program Files (x86)\Common Files\System\ado\msado15.dll
在MFC项目头文件添加:

#import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" \
		no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")

MFC链接SQL Server ——学生成绩管理系统_第3张图片

在连接数据库操作的类中添加以下代码

18042115.h中定义ADO智能指针 :_ConnectionPtr m_pCon;
声明类成员函数: BOOL ConnectDataBase(CString strLinkWord);
MFC链接SQL Server ——学生成绩管理系统_第4张图片
在18042115.c添加成员函数:

BOOL CMy18042115App::ConnectDataBase(CString strLinkWord)
{
     
	::CoInitialize(NULL);
	if (!SUCCEEDED(m_pCon.CreateInstance(__uuidof(Connection))))
	{
     
		m_pCon = NULL;
		TRACE("Database createInstance failed");
	}

	ASSERT(m_pCon != NULL);
	try
	{
     
		return SUCCEEDED(m_pCon->Open(_bstr_t(strLinkWord), _bstr_t(L""), _bstr_t(L""), adModeUnknown));
	}
	catch (_com_error& e)
	{
     
		CString str;
		str.Format(L"%S\n", e.ErrorMessage());
		AfxMessageBox(str);
		return FALSE;
	}
}

在CMy18042115App::InitInstance()函数中添加代码:

	CString strLinkWord = L"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;\
							Initial Catalog=Student;Data Source=NAN-DESKTOP\\MSSQLSERVER1";
	if (!ConnectDataBase(strLinkWord))
		return FALSE;
	AfxMessageBox(L"Database connected succeedly");

传递指针 dlg.m_pCon = m_pCon;
注意:
18042115Dlg.h里定义 _ConnectionPtr m_pCon;

MFC链接SQL Server ——学生成绩管理系统_第5张图片
至此,连接数据库成功。
MFC链接SQL Server ——学生成绩管理系统_第6张图片

登录对话框(18042115Dlg)

连接数据库成功,点击确定,打开登陆界面。
MFC链接SQL Server ——学生成绩管理系统_第7张图片
在18042115Dlg.h中,添加以下代码:
注意:m_Sno,m_Sdp为Edit Control控件变量。

	CString m_Sno;		//添加学号变量
	CString m_Spd;		//添加密码变量
	
	_RecordsetPtr m_pRec;
	_ConnectionPtr m_pCon;	//注意m_pCon的传递
	
	_RecordsetPtr DBRecordSetGet(LPCTSTR sql);
	BOOL GetCollect(LPCTSTR Name, _variant_t& OutCol);

MFC链接SQL Server ——学生成绩管理系统_第8张图片
在18042115Dlg.c中添加以下代码:
1、先添加成员函数

//添加成员函数
_RecordsetPtr CMy18042115Dlg::DBRecordSetGet(LPCTSTR sql)
{
     
	// TODO: 在此处添加实现代码.
	m_pRec.CreateInstance("ADODB.Recordset");
	m_pRec = m_pCon->Execute((_bstr_t)sql, NULL, adCmdText);

	return m_pRec;
}

BOOL CMy18042115Dlg::GetCollect(LPCTSTR Name, _variant_t& OutCol)
{
     
	// TODO: 在此处添加实现代码.
	_variant_t vt;
	vt = m_pRec->GetCollect(Name);
	if (vt.vt != VT_NULL)
	{
     
		OutCol = vt;
		return TRUE;
	}
	else
		return FALSE;
}

2、确认登录按钮代码

// 登录确定按钮
void CMy18042115Dlg::OnBnClickedOk()
{
     
	// TODO: 在此添加控件通知处理程序代码
	
	//获取输入的学号密码
	//GetDlgItemText(IDC_EDIT1, m_Sno);
	//GetDlgItemText(IDC_EDIT2, m_Spd);
	UpdateData(TRUE);			//将控件的值赋值给成员变量

	CString sql;				//获取的学号密码进行匹对
	sql.Format(L"exec Login_S '%s','%s'", m_Sno, m_Spd);	
	m_pRec = DBRecordSetGet(sql);		//执行SQL语句

	_variant_t var;
	GetCollect(L"nums", var);
	int temp = var.intVal;

	//学号密码正确,显示学生信息
	if (temp)
	{
     
		Dlg1 dlg1;
		dlg1.m_pCon = m_pCon;	//注意m_pCon的传递
		dlg1.m_Sno = m_Sno;
		dlg1.DoModal();
		//CDialogEx::OnOK();
	}
	else
	{
     
		CString str;
		str.Format(L"error");
		MessageBox(str);
	}
}

SQL新建存储过程Login_S:

create procedure Login_S
@SNO char(5),
@PSD nchar(8)
as
select COUNT(*) as nums from S
where S.学号=@SNO and S.Password=@PSD

登录成功,显示个人信息。

个人信息对话框(Dlg1)

新建Dlg1,添加Dlg1类。
MFC链接SQL Server ——学生成绩管理系统_第9张图片
在Dlg1.h的Dlg1类中添加以下代码:
注意:m_list为List Control控件变量

public:
	CString m_Sno;		//添加学号变量
	CString m_Spd;		//添加密码变量

	_ConnectionPtr m_pCon;	//注意m_pCon的传递
	_RecordsetPtr m_pRec;

	_RecordsetPtr DBRecordSetGet(LPCTSTR sql);
	BOOL GetCollect(LPCTSTR Name, _variant_t& OutCol);

	void LoadSCdata();
	CListCtrl m_list;
	
	virtual BOOL OnInitDialog();
	
	afx_msg void OnBnClickedButtonSelectclass();
	afx_msg void OnBnClickedButtonChangepw();
	afx_msg void OnBnClickedCancel();

初始化Dlg1:
1、Dlg1.c中添加成员函数

// 添加成员函数
_RecordsetPtr Dlg1::DBRecordSetGet(LPCTSTR sql)
{
     
	// TODO: 在此处添加实现代码.
	m_pRec.CreateInstance("ADODB.Recordset");
	m_pRec = m_pCon->Execute((_bstr_t)sql, NULL, adCmdText);

	return m_pRec;
}
BOOL Dlg1::GetCollect(LPCTSTR Name, _variant_t& OutCol)
{
     
	// TODO: 在此处添加实现代码.
	_variant_t vt;
	vt = m_pRec->GetCollect(Name);
	if (vt.vt != VT_NULL)
	{
     
		OutCol = vt;
		return TRUE;
	}
	else
		return FALSE;
}

2、添加Dlg1初始化函数:OnInitDialog函数
类向导->虚函数->OnInitDialog,双击添加

// 添加OnInitDialog函数,完成Dlg1初始化
BOOL Dlg1::OnInitDialog()
{
     
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化
	CString sql;
	sql.Format(L"exec Information_S '%s'", m_Sno);	//获取学生信息
	m_pRec = DBRecordSetGet(sql);					//执行语句

	_variant_t var;
	CString t;

	GetCollect(L"学号", var);
	t.For、mat(L"学号:%s", var.bstrVal);
	SetDlgItemText(IDC_STATIC_Sno, t);

	GetCollect(L"姓名", var);
	t.Format(L"姓名:%s", var.bstrVal);
	SetDlgItemText(IDC_STATIC_Sname, t);

	GetCollect(L"性别", var);
	t.Format(L"性别:%s", var.bstrVal);
	SetDlgItemText(IDC_STATIC_Ssex, t);

	GetCollect(L"年龄", var);
	t.Format(L"年龄:%d", var.intVal);
	SetDlgItemText(IDC_STATIC_Sage, t);

	GetCollect(L"所在系", var);
	t.Format(L"所在系:%s", var.bstrVal);
	SetDlgItemText(IDC_STATIC_Scollege, t);

	// Dlg1::OnInitDialog 中设置表格属性(P36)
	m_list.ModifyStyle(LVS_ICON | LVS_SMALLICON | LVS_LIST, LVS_REPORT);
	m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
	m_list.InsertColumn(0, L"课程号");
	m_list.InsertColumn(1, L"课程名");
	m_list.InsertColumn(2, L"学时数");
	m_list.InsertColumn(3, L"任课老师");
	m_list.InsertColumn(4, L"成绩");

	RECT rect;
	m_list.GetWindowRect(&rect);
	int wid = (rect.right - rect.left) / 7;				//wid 格宽度
	m_list.SetColumnWidth(0, wid);
	m_list.SetColumnWidth(1, 2 * wid);
	m_list.SetColumnWidth(2, wid);
	m_list.SetColumnWidth(3, wid);
	m_list.SetColumnWidth(4, 2 * wid);

	LoadSCdata();
	//UpdateData(false);								//显示数据
	
	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

//更新表格数据
void Dlg1::LoadSCdata()								
{
     
	// TODO: 在此处添加实现代码.
	CString sql;
	sql.Format(L"exec SelectClass_S '%s'", m_Sno);	//获取学生选课信息
	m_pRec = DBRecordSetGet(sql);
	if (m_pRec == NULL)
		return;
	m_list.DeleteAllItems();						//清空表格
	int j = 0;
	while (!m_pRec->adoEOF)
	{
     
		m_list.InsertItem(j, L"");
		_variant_t var;

		m_list.SetItemText(j, 0, (LPTSTR)(_bstr_t)m_pRec->GetCollect("课程号"));
		m_list.SetItemText(j, 1, (LPTSTR)(_bstr_t)m_pRec->GetCollect("课程名"));
		m_list.SetItemText(j, 2, (LPTSTR)(_bstr_t)m_pRec->GetCollect("学时数"));
		m_list.SetItemText(j, 3, (LPTSTR)(_bstr_t)m_pRec->GetCollect("任课老师"));
		var = m_pRec->GetCollect("成绩");
		if (var.vt != VT_NULL)
		{
     
			m_list.SetItemText(j, 4, (LPTSTR)(_bstr_t)var);
		}
		else
			m_list.SetItemText(j, 4, TEXT(""));
		m_pRec->MoveNext();
		j++;
	}
}

SQL新建存储过程 Information_S:

create procedure Information_S
@SNO char(5)
as
select 学号,姓名,性别,年龄,所在系 from S
where S.学号=@SNO 

SQL新建存储过程 SelectClass_S:

create procedure SelectClass_S
@SNO char(5)
as
select C.课程号,课程名,学时数,任课老师,成绩
from SC,C
where  C.课程号=SC.课程号 and 学号=@SNO

显示个人信息:
MFC链接SQL Server ——学生成绩管理系统_第10张图片

修改密码对话框(Dlg2)

新建Dlg2,添加Dlg2类。
MFC链接SQL Server ——学生成绩管理系统_第11张图片
在Dlg2.h的Dlg2类中添加以下代码:
NewPassword 为Edit Control控件变量。

public:
	CString m_Sno;		//添加学号变量
	CString m_Spd;		//添加密码变量

	_ConnectionPtr m_pCon;	//注意m_pCon的传递
	_RecordsetPtr m_pRec;

	_RecordsetPtr DBRecordSetGet(LPCTSTR sql);
	BOOL GetCollect(LPCTSTR Name, _variant_t& OutCol);

	CString NewPassword;	//Edit Control控件变量
	afx_msg void OnBnClickedOk();

Dlg2 消息处理程序:
1、Dlg2.c中添加成员函数

// 添加成员函数
_RecordsetPtr Dlg2::DBRecordSetGet(LPCTSTR sql)
{
     
	// TODO: 在此处添加实现代码.
	m_pRec.CreateInstance("ADODB.Recordset");
	m_pRec = m_pCon->Execute((_bstr_t)sql, NULL, adCmdText);

	return m_pRec;
}

BOOL Dlg2::GetCollect(LPCTSTR Name, _variant_t& OutCol)
{
     
	// TODO: 在此处添加实现代码.
	_variant_t vt;
	vt = m_pRec->GetCollect(Name);
	if (vt.vt != VT_NULL)
	{
     
		OutCol = vt;
		return TRUE;
	}
	else
		return FALSE;
}

2、双击确定按钮,添加代码:

//输入新密码,点击确定
void Dlg2::OnBnClickedOk()
{
     
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(true);			//更新数据
		//UpdateData(false);			//显示数据
	CString sql;
	sql.Format(L"exec ChangePassword_S '%s','%s'", m_Sno, NewPassword);	//修改学生密码
	m_pRec = DBRecordSetGet(sql);					//执行语句
	CDialogEx::OnOK();
	AfxMessageBox(L"修改密码成功");
}

SQL新建存储过程ChangePassword_S:

create procedure ChangePassword_S
@SNO char(5),
@PSD nchar(8)
as
update S
set Password=@PSD
where S.学号=@SNO 

在Dlg1双击修改密码按钮,在该函数内添加代码:
注意:在Dlg1.c里添加头文件:#include "Dlg2.h"

	Dlg2 dlg2;
	dlg2.m_pCon = m_pCon;	//注意m_pCon的传递
	dlg2.m_Sno = m_Sno;
	dlg2.DoModal();
	CDialogEx::OnCancel();	//修改密码成功,退出登录

修改密码成功:
MFC链接SQL Server ——学生成绩管理系统_第12张图片

选课对话框(Dlg3)

新建Dlg3,添加Dlg3类。
MFC链接SQL Server ——学生成绩管理系统_第13张图片
在Dlg3.h的Dlg3类中添加以下代码:
m_list为List Control控件变量

	CListCtrl m_list;	//List Control控件变量
	CString strSel;	//strSel为要选课的课程号,点击选课框获取。

	void LoadSCdata();

	CString m_Sno;			//添加学号变量
	_ConnectionPtr m_pCon;	//注意m_pCon的传递
	_RecordsetPtr m_pRec;
	_RecordsetPtr DBRecordSetGet(LPCTSTR sql);
	BOOL GetCollect(LPCTSTR Name, _variant_t& OutCol);

MFC链接SQL Server ——学生成绩管理系统_第14张图片

Dlg3初始化
1、Dlg3.c里添加成员函数

// // 添加成员函数
_RecordsetPtr Dlg3::DBRecordSetGet(LPCTSTR sql)
{
     
	// TODO: 在此处添加实现代码.
	m_pRec.CreateInstance("ADODB.Recordset");
	m_pRec = m_pCon->Execute((_bstr_t)sql, NULL, adCmdText);

	return m_pRec;
}
BOOL Dlg3::GetCollect(LPCTSTR Name, _variant_t& OutCol)
{
     
	// TODO: 在此处添加实现代码.
	_variant_t vt;
	vt = m_pRec->GetCollect(Name);
	if (vt.vt != VT_NULL)
	{
     
		OutCol = vt;
		return TRUE;
	}
	else
		return FALSE;
}

2、添加Dlg3初始化函数:OnInitDialog函数
类向导->虚函数->OnInitDialog,双击添加。

//更新表格数据
void Dlg3::LoadSCdata()
{
     
	// TODO: 在此处添加实现代码.
	CString sql;
	sql.Format(L"exec UnSelC_S '%s'", m_Sno);		//获取学生可选课信息
	m_pRec = DBRecordSetGet(sql);
	if (m_pRec == NULL)
		return;
	m_list.DeleteAllItems();					//清空表格
	int j = 0;
	while (!m_pRec->adoEOF)
	{
     
		m_list.InsertItem(j, L"");
		_variant_t var;

		m_list.SetItemText(j, 0, (LPTSTR)(_bstr_t)m_pRec->GetCollect("课程号"));
		m_list.SetItemText(j, 1, (LPTSTR)(_bstr_t)m_pRec->GetCollect("课程名"));
		m_list.SetItemText(j, 2, (LPTSTR)(_bstr_t)m_pRec->GetCollect("学时数"));
		m_list.SetItemText(j, 3, (LPTSTR)(_bstr_t)m_pRec->GetCollect("任课老师"));
		m_pRec->MoveNext();
		j++;
	}
}
//Dlg3初始化函数
BOOL Dlg3::OnInitDialog()
{
     
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化
	m_list.ModifyStyle(LVS_ICON | LVS_SMALLICON | LVS_LIST, LVS_REPORT);
	m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
	m_list.InsertColumn(0, L"课程号");
	m_list.InsertColumn(1, L"课程名");
	m_list.InsertColumn(2, L"学时数");
	m_list.InsertColumn(3, L"任课老师");

	RECT rect;
	m_list.GetWindowRect(&rect);
	int wid = (rect.right - rect.left) / 5;					//wid 格宽度
	m_list.SetColumnWidth(0, wid);
	m_list.SetColumnWidth(1, 2 * wid);
	m_list.SetColumnWidth(2, wid);
	m_list.SetColumnWidth(3, wid);

	LoadSCdata();

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

SQL新建存储过程UnSelC_S:

create procedure UnSelC_S
@Sno char(5)
as
select 课程号,课程名,学时数,任课老师
from C
where 课程号 not in
(select 课程号 from SC where 学号=@Sno)

在Dlg1双击选课按钮,添加代码:
注意:在Dlg1.h里添加头文件:#include “Dlg3.h”

	Dlg3 dlg3;
	dlg3.m_pCon = m_pCon;  //注意m_pCon的传递
	dlg3.m_Sno = m_Sno;
	if (dlg3.DoModal() == IDOK)//选课完成,更新信息
		LoadSCdata();

显示可选课信息:
MFC链接SQL Server ——学生成绩管理系统_第15张图片
激活List Control控件的NM_CLICK事件。
MFC链接SQL Server ——学生成绩管理系统_第16张图片

Dlg3 消息处理程序:

void Dlg3::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
     
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	int i = m_list.GetSelectionMark();
	strSel = m_list.GetItemText(i, 0);
	MessageBox(strSel);
	*pResult = 0;
}

void Dlg3::OnBnClickedOk()
{
     
	// TODO: 在此添加控件通知处理程序代码
	if (strSel == L"")
	{
     
		MessageBox(L"请选课");
		return;
	}
	//获取学生可选课信息
	CString sql;
	sql.Format(L"exec InsertClass_S '%s','%s'", m_Sno, strSel);	
	m_pRec = DBRecordSetGet(sql);
	if (m_pRec == NULL)
		return;
	else
		MessageBox(L"选课成功");

	CDialogEx::OnOK();
}

SQL新建存储过程InsertClass_S:

create procedure InsertClass_S
@Sno char(5),@Cno char(5)
as
insert into SC(学号,课程号)
values (@Sno,@Cno)

点击要选的课。(注释掉 Dlg3::OnClickList1 中的 MessageBox(strSel); 不会弹出选的课程号)
MFC链接SQL Server ——学生成绩管理系统_第17张图片
选课成功。
MFC链接SQL Server ——学生成绩管理系统_第18张图片
刷新已选课信息。
MFC链接SQL Server ——学生成绩管理系统_第19张图片

你可能感兴趣的:(数据库,MFC,SQL,Server,mfc,数据库,sqlserver)