新建一个udl文件,服务器名称与SQL Server服务器保持一致。选择相应的数据库,测试连接。
(先建好数据库)
将udl文件改成txt文件。
打开该文件,第3行为SQL Server数据库连接字符串。
新建基于对话框的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")
18042115.h中定义ADO智能指针 :_ConnectionPtr m_pCon;
声明类成员函数: BOOL ConnectDataBase(CString strLinkWord);
在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;
连接数据库成功,点击确定,打开登陆界面。
在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);
在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.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
新建Dlg2,添加Dlg2类。
在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(); //修改密码成功,退出登录
新建Dlg3,添加Dlg3类。
在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);
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();
显示可选课信息:
激活List Control控件的NM_CLICK事件。
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); 不会弹出选的课程号)
选课成功。
刷新已选课信息。