武大印包C++实习报告数据库实习报告.docx
- 文档编号:20157040
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:25
- 大小:497.08KB
武大印包C++实习报告数据库实习报告.docx
《武大印包C++实习报告数据库实习报告.docx》由会员分享,可在线阅读,更多相关《武大印包C++实习报告数据库实习报告.docx(25页珍藏版)》请在冰豆网上搜索。
武大印包C++实习报告数据库实习报告
《面向对象程序设计》实习数据库部分
马滔
实验目的:
1、通过C++的编写程序来熟悉数据库相关程序操作2、了解掌握如何实现对数据库的读写、插入、修改、删除、及查询操作。
一、功能模块分析
1程序框架说明
程序为一对话框程序,主要实现的就是对数据库的读写、修改、插入、删除、及查询操作。
图一
对于插入和修改的操作通过另一个变动对话框进行数据输入
图二
查询操作通过弹出一个单独的查询对话框进行
图三
2.读取数据库表中内容
在读取按钮的响应函数voidCMtg1Dlg:
:
OnBtnRead()中添加代码,通过CStringstrName,strAge;将数据库表中的内容全部显示在学生信息对话框的ListBox控件中
3.删除数据库表中内容
在删除按钮的响应函数voidCMtg1Dlg:
:
OnBtnDelete(),选中一条记录,获得其指针,删除当前记录。
4.修改数据库表中内容
在修改按钮的响应函数voidCMtg1Dlg:
:
OnBtnModify()。
选中一条记录,点击修改按钮,弹出变动对话框,在其中修改记录内容,然后通过确定按钮的响应函数将修改后的值传入修改函数中,修改记录并更新列表。
5.在数据库表中插入内容
在插入按钮的响应函数voidCMtg1Dlg:
:
OnBtnInsert()。
点击插入按钮,弹出变动对话框,在其中添加记录内容,然后通过确定按钮的响应函数将添加的值传入添加函数中,添加记录并更新列表。
6.查询数据库表中内容
在查询按钮的响应函数voidCMtg1Dlg:
:
OnBtnQuery()。
点击查询按钮,弹出查询对话框,在其中输入查询的内容,然后通过单击查询,在其响应函数voidCQueryDlg:
:
OnBtnCheck()中查到记录,然后将符合条件的结果的姓名和年龄显示在查询对话框的列表控件中。
二、实验环境与步骤
//交待清楚实验环境、具体的实现过程,按步骤阐述清楚,有必要的地方可以截图。
当前的设计是在Windows7的32位系统中,安装MicrosoftVisualC++6.0的可视化集成开发环境(integrateddevelopmentenvironment,IDE)下进行的。
采用MFCAppWizard应用程序向导建立的基于对话框的框架mtg1实现对数据库操作。
具体过程如下:
一.创建工程与数据库
1.新建程序
运行MicrosoftVisualC++6.0在其中打开新建创建工程,采用MFCAppWizard应用程序向导建立的对话框的框架的工程mtg1。
2.新建数据库
在MicrosoftAccess2007中创建一个新的数据库,保存的时候保存为2000版的兼容版,也就是Demo.mdb,并添加名为StudentInfo的表,在其中添加姓名和年龄两个属性,不设关键字。
如下图:
图四
二.操作功能的实现
1.引入ADO库
在程序中对数据库的操作都是使用ADO(ActiveXDataObjects)组件库实现的。
ADO是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统。
在使用ADO库之前需要添加如下代码
(1)在StdAfx.h头文件中添加
//加入ADO库
#import"c:
\programfiles\commonfiles\system\ado\msado15.dll"\no_namespace\rename("EOF","adoEOF")
(2)应用程序实现文件添加BOOLCMtg1App:
:
InitInstance()
//初始化com
本程序中在mtg1.cpp的InitInstance()函数中添加如下代码
if(!
AfxOleInit())
{
AfxMessageBox("com初始化失败!
");
returnFALSE;
}
2.创建ADO连接和退出时清除连接
在mtg1.h文件中定义ADO连接变量指针:
_ConnectionPtrm_pConnection;
在mtg1.cpp中的BOOLCMtg1App:
:
InitInstance()函数中进行连接数据库:
m_pConnection.CreateInstance(__uuidof(Connection));
//创建ADOCONNECTION的实例
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
try
{
//打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.mdb","","",adModeUnknown);
}
catch(_com_errore)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!
");
returnFALSE;
}
3.设计对话框
利用对话框控件设计一个如下的对话框:
图五
1)添加五个按钮及其消息处理函数:
读取(IDC_BTN_READ),消息处理函数voidCMtg1Dlg:
:
OnBtnRead()
修改(IDC_BTN_MODIFY),消息处理函数voidCMtg1Dlg:
:
OnBtnModify()
插入(IDC_BTN_INSERT),消息处理函数voidCMtg1Dlg:
:
OnBtnInsert()
查询(IDC_BTN_QUERY),消息处理函数voidCMtg1Dlg:
:
OnBtnQuery()
删除(IDC_BTN_DELETE)。
消息处理函数voidCMtg1Dlg:
:
OnBtnDelete()2)添加列表控件框用于实现数据库内容显示:
列表控件(IDC_LIST_INFO),处理函数voidCMtg1Dlg:
:
OnSelchangeListInfo(),并为该控件添加一个控制变量CListBoxm_listStudentInfo;
4.读取数据库表中内容
1)打开读取
读取的时候要用到ADO记录集,所以在mtg1.h中定义一个记录集指针变量:
_RecordsetPtrm_pRecordset;
然后在BOOLCMtg1Dlg:
:
OnInitDialog()添加打开表的代码:
图六
2)在读取按钮的响应函数voidCMtg1Dlg:
:
OnBtnRead()中添加如下代码:
variant_tvar;
CStringstrName,strAge;
//清空列表框
m_listStudentInfo.ResetContent();
strName=strAge="";
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误
try
{
if(!
m_pRecordset->adoEOF)//判断记录是否为空
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
//读入库中各字段并加入列表框中
while(!
m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("姓名");
if(var.vt!
=VT_NULL)//判断Name字段的值是否为空
strName=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("年龄");
if(var.vt!
=VT_NULL)//判断Age字段的值是否为空
strAge=(LPCSTR)_bstr_t(var);
m_listStudentInfo.AddString(strName+"-->"+strAge);
m_pRecordset->MoveNext();
}
//默认列表指向第一项,同时移动记录指针并显示
m_listStudentInfo.SetCurSel(0);
//OnSelchangeListaccess();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
3)在列表控件响应函数voidCMtg1Dlg:
:
OnSelchangeListInfo()添加代码:
voidCMtg1Dlg:
:
OnSelchangeListInfo()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intcurSel=m_listStudentInfo.GetCurSel();
_variant_tvar,varIndex;
if(curSel<0)
return;
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));
}
5.删除数据库表中内容
在删除按钮的消息处理函数voidCMtg1Dlg:
:
OnBtnDelete()添加代码:
voidCMtg1Dlg:
:
OnBtnDelete()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
try
{
//删除当前行记录
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
//删除列表中当前值
intnCurSel=m_listStudentInfo.GetCurSel();
m_listStudentInfo.DeleteString(nCurSel);
if(nCurSel==0&&(m_listStudentInfo.GetCount()!
=0))
m_listStudentInfo.SetCurSel(nCurSel);
elseif(m_listStudentInfo.GetCount()!
=0)
m_listStudentInfo.SetCurSel(nCurSel-1);
//移动记录指针到新的位置
OnSelchangeListInfo();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}
6.向数据库表中插入内容
1)新建一个变动的对话框并添加一个新的类CRcordDlg:
图七
添加控件,更改编辑框的ID添加变量:
IDC_EDIT_AGE,CStringm_strAge;
IDC_EDIT_NAME,CStringm_strName;
2)在插入按钮的消息处理函数voidCMtg1Dlg:
:
OnBtnInsert()添加代码:
通过变动对话框中输入的信息传入函数OnBtnInsert()进行处理
voidCMtg1Dlg:
:
OnBtnInsert()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
VARIANTvarBLOB;
SAFEARRAY*psa;
SAFEARRAYBOUNDrgsabound[1];
CStringstrName,strAge;
CRcordDlgdlgRecord;//打开RECORD对话框
if(dlgRecord.DoModal()!
=IDOK)
return;
strName=dlgRecord.m_strName;
strAge=dlgRecord.m_strAge;
if(strName==""||strAge=="")
{
AfxMessageBox("姓名和年龄信息不能为空!
");
return;
}
try
{
//写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("姓名",_variant_t(strName));
m_pRecordset->PutCollect("年龄",_variant_t(strAge));
m_pRecordset->Update();
AfxMessageBox("插入成功!
");
OnBtnRead();
intnCurSel=m_listStudentInfo.GetCount();
m_listStudentInfo.SetCurSel(nCurSel);
//移动记录指针到新的位置
//OnSelchangeListaccess();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}
7.修改数据库表中内容
在修改按钮的消息处理函数voidCMtg1Dlg:
:
OnBtnModify()添加代码:
选中一条记录,点击修改按钮,将记录的信息传入变动对话框,然后做出修改,点击确定,将修改后的信息保存到记录中,并再次读取数据库内容。
voidCMtg1Dlg:
:
OnBtnModify()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrName,strAge;
//1.取当前姓名和年龄的值
intcurSel=m_listStudentInfo.GetCurSel();
_variant_tvar,varIndex;
if(curSel<0)
return;
UpdateData();
try
{
//先将指针移向第一条记录,然后相对第一条记录来随意移动记录指针
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));
var=m_pRecordset->GetCollect("姓名");
if(var.vt!
=VT_NULL)
strName=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("年龄");
if(var.vt!
=VT_NULL)
strAge=(LPCSTR)_bstr_t(var);
UpdateData(false);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
//2.将姓名和年龄的值传递给对话框
CRcordDlgdlgRecord;
dlgRecord.m_strName=strName;
dlgRecord.m_strAge=strAge;
if(dlgRecord.DoModal()!
=IDOK)
return;
//3.将修改后的姓名和年龄写入数据库并刷新显示
strName=dlgRecord.m_strName;
strAge=dlgRecord.m_strAge;
try
{
m_pRecordset->PutCollect("姓名",_variant_t(strName));
m_pRecordset->PutCollect("年龄",_variant_t(strAge));
m_pRecordset->Update();
AfxMessageBox("修改成功!
");
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
OnBtnRead();
}
8.查询数据库表中内容
1)新建查询对话框及添加新的类CQueryDlg:
图八
添加控件修改ID并为其添加变量或消息响应函数:
IDC_EDIT_NAME,变量CStringm_CheckName;
IDC_EDIT_AGE,变量CStringm_CheckAge;
IDC_LIST1,变量CListCtrlm_CheckList;修改属性中样式选项卡,将查看下拉列表中图标改为报告。
IDC_BTN_CHECK,消息处理函数voidCQueryDlg:
:
OnBtnCheck()
2)为voidCQueryDlg:
:
OnBtnCheck()添加代码:
voidCQueryDlg:
:
OnBtnCheck()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_CheckList.DeleteAllItems();
UpdateData(TRUE);
if(""==m_CheckName)
{
MessageBox("输入姓名不能为空!
");
return;
}
_RecordsetPtrm_pRecordsetC;//定义记录集对象
m_pRecordsetC.CreateInstance(__uuidof(Recordset));
CStringstrSQL;
_variant_tvar;
CStringstrName,strAge;
strSQL.Format("select*fromStudentInfowhere姓名Like'%%%s%%'",m_CheckName);
if(m_CheckAge!
="")
{
strSQL+="";
strSQL+="or";
strSQL+="";
strSQL+="Age";
strSQL+="=";
strSQL+="'";
strSQL+=m_CheckAge;
strSQL+="'";
}
try
{
m_pRecordsetC->Open((_variant_t)strSQL,//查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
if(m_pRecordsetC->adoEOF)
{
AfxMessageBox("没有查询到你要查询的数据!
",MB_OK);
}
while(!
m_pRecordsetC->adoEOF)
{
var=m_pRecordsetC->GetCollect("姓名");
if(var.vt!
=VT_NULL)
strName=(LPCSTR)_bstr_t(var);
var=m_pRecordsetC->GetCollect("年龄");
if(var.vt!
=VT_NULL)
strAge=(LPCSTR)_bstr_t(var);
inti=m_CheckList.GetItemCount();
m_CheckList.InsertItem(i,strName);//添加新Item到i所在位置,虽然记录个数是i个,但最后一行所在位置为i-1
m_CheckList.SetItemText(i,1,strAge);
i=i+1;
m_pRecordsetC->MoveNext();
}
//OnSelchangeListaccess();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
UpdateData(FALSE);//TODO:
Addextravalidationhere
}
3)在类向导中为类CQueryDlg添加函数BOOLCQueryDlg:
:
OnInitDialog(),并为其添加如下代码:
BOOLCQueryDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
Addextrainitializationhere
:
:
SendMessage(m_CheckList.m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
//////////为列表控件添加列//////////
//m_CheckList.SetBkColor(RGB(162,189,252));
m_CheckList.InsertColumn(0,"姓名",LVCFMT_LEFT,60);
m_CheckList.InsertColumn(1,"年龄",LVCFMT_LEFT,100);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
4)为学生信息对话框中的查询按钮函数voidCMtg1Dlg:
:
OnBtnQuery()添加代码:
voidCMtg1Dlg:
:
OnBtnQuery()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CQueryDlgdlgQuery;
dlgQuery.DoModal();
}
三、实验结果及分析
实验结果(要有截屏图),根据结果对自己的代码进行分析。
总结自己在编程过程中的遇到的问题、解决方法以及自己的体会
一.实验结果截图:
1.数据库内容读取
图九
2.数据库内容删除
选中张三确定为要删除的记录:
图十
删除张三后的对话框:
图十一
3.数据库内容插入
单击插入,弹出变动对话框,在其中输入要插入的内容:
图十二
点击确定后,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大印 C+ 实习 报告 数据库
![提示](https://static.bdocx.com/images/bang_tan.gif)