ODBC MFC实验指导文档格式.docx
- 文档编号:4473293
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:20
- 大小:87.22KB
ODBC MFC实验指导文档格式.docx
《ODBC MFC实验指导文档格式.docx》由会员分享,可在线阅读,更多相关《ODBC MFC实验指导文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
(4)设计界面,并使控件与数据表字段关联。
1、设计数据库
数据库表与表之间的关系构成了一个数据库。
用MicrosoftAccess
创建一个数据库Student.mdb,其中包含两个表xs和zy,如下表所示:
表1:
学生表(xs)及其表结构
学号(stuid)姓名(name)性别(sex)专业代号(profcode)
990101李林男102001
990102高山男102001
990201王平男109003
990202丁玲女109003
续表1:
序号字段名称数据类型字段大小小数位字段含义
1stuid文本6学号
2name文本8姓名
3sex文本2性别
4profcode文本6专业代号
表2:
专业代码表(zy)及其表结构
专业代号(profcode)专业名称(profname)学制(stuyears)
102001计算机科学与技术4
102002计算机软件技术3
102003计算机网络技术3
102004计算机软件工程4
109003计算机网络工程4
续表2:
1profcode文本6专业代号
2profname文本12专业名称
3stuyears数字整型自动学制
2、创建ODBC的数据源
桌面左下角开始设置控制面板性能和维护->
管理工具双击ODBC图标,进入ODBC数据源管理器,在这里用户可以设置ODBC数据源的一些信息,其中的“用户DNS”页面是用户定义自己在本地计算机使用的数据源名(DNS)。
(1)单击[添加]按钮,弹出有一驱动程序列表的“创建新数据源”对话框。
(2)在该对话框中选择要添加用户数据源的驱动程序,这里选择“MicrosoftAccessDriver”。
单击[完成]按钮,进入特定驱动程序的安装对话框。
(3)在对话框中,单击[选取]按钮将前面创建的数据库student调入,见下图所示。
(4)单击[确定]按钮,给刚才创建的用户数据源起名“DatabaseExmpleForVC++”写在数据源名,单击[确定]便使其添加在“ODBC数据源管理器”的“用户数据源”列表中。
3、在MFCAppWizard中选择数据源
用MFCAppWizard(exe)可以很容易地创建一个支持数据库的SDI/MDI的应用程序,过程如下:
(1)用MFCAppWizard(exe)创建一个单文档应用程序:
数据库
(2)在向导的第2步对话框中加入数据库的支持。
在该对话框中用户可以选择对数据库支持程序。
(3)选中“数据库查看使用文件支持Databaseviewwithfilesupport”项,单击[DataSource]按钮,弹出“DatabaseOptions”对话框。
(4)从中选择你刚才起好名的ODBC的数据源“DatabaseExampleForVC++”,单击[OK]按钮,弹出“SelectDatabaseTable”对话框,从中选择要使用的表(选择xs)。
(5)单击[OK]按钮,又回到了向导的第2步对话框,保留默认设置,单击[Finish]按钮。
(6)编译运行结果。
说明:
MFCAppWizard创建的“数据库”应用程序与一般默认的单文档应用程序相比较,在类结构方面,有如下几点不同:
1)添加了一个CMySet类,它与上述过程中所选择的数据表xs进行数据绑定,也就是说,CMySet对象的操作实质上对数据表进行操作。
2)将CMyView类的基类设置成CRecordView,由于CRecordView的基类是CFormView,因此它需要与之相关联的表单资源。
3)在CMyView类中添加了一个全局的CMySet对象指针变量m_pSet,目的是在表单视图和记录集之间建立联系,使得记录集中的查询结果能够很容易地在表单视图上显示出来。
4、设计浏览记录界面
在“数据库”应用程序中,MFC为用户自动创建了用于浏览数据表记录的工具按钮和相应的“记录”选单项。
若用户选择这些浏览记录命令,系统会自动调用相应的函数来移动数据库表的当前位置。
若在表单视图CMyView中添加控件并与表的字段相关联,就可以根据表的当前记录位置显示相应的数据。
(1)打开“数据库”应用程序
(2)切换到项目工作区窗口的ResourceView页面,双击用于表单视图CMyView的对话框资源IDD_MY_FORM.
(3)参看下图1向对话框中添加下列控件:
控件ID号标题属性
组框默认学生表默认
静态文本默认学号:
..
编辑框IDC_STU_ID……..
静态文本默认姓名:
编辑框IDC_STU_NAME…..
静态文本默认性别..
编辑框IDC_STU_SEX…..
静态文本默认专业代号..
编辑框IDC_PROF_CODE…......
图1:
控件的设计
(4)加数据成员:
选择“View”选单->
“ClassWizard”命令或按快捷键Ctrl+W,弹出ClassWizard对话框,切换到MemberVaribles页面,在Classname框中选择CMyView,为上述控件添加相关联的数据成员。
与以往添加数据成员不同的是,这里添加的数据成员都是由系统自动定义的,并与数据库表字段相关联。
例如,双击IDC_PROF_CODE,在弹出的“AddMemberVariable”对话框中的成员变量下拉列表中选择要添加的成员变量名m_pSet->
m_profcode
(5)按上步添加成员变量的方法将下列表中所列控件依次添加相关联的数据成员。
控件ID号变量类型变量名字符长度
IDC_PROF_CODECString->
m_profcode6
IDC_STU_NAMECString->
m_name8
IDC_STU_IDCString->
m_stuid6
IDC_STU_SEXCString->
m_sex2
注意:
字符长度应与上面建地数据库表1的字段大小相同
(6)编译并运行,结果如下图2所示:
图2:
浏览记录结果
5、ODBC数据表绑定更新(改变与m_pSet关联的表)
上述过程虽没有添加任何代码,但却能浏览表中的记录内容。
特别需要说明的是,在生成的CMyView类中,包含一个指向CMySet对象的指针m_pSet。
该指针与用户的表(这里是xs)相关联,它是由MFCAppWizard建立的,目的是在表单视图和记录集之间建立联系,使得记录集中的查询结果很容易地在表单视图上显示出来。
当然,m_pSet所关联的表也可通过ClassWizard来改变。
其方法如下:
(1)将ClassWizard对话框切换到“MemberVariables”页面,在“Classname”的下拉列表中选择“CMyCSet”,此时ClassWizard对话框的[UpdateColumns](重新指定与CRecordset类相关的表)和[BindAll](为表的字段定义默认的成员变量)按钮被激活。
(2)单击[UpdateColumns]按钮,将弹出“DatabaseOptions”对话框
(3)从中选择ODBC的数据源“DatabaseExampleForVC++”,单击[OK]按钮,弹出如下图3所示,从中选择要使用的表。
(4)单击[OK]按钮,回到ClassWizard界面。
(5)若表中的各个字段还没有相应的数据成员,可单击[BindAll]按钮进行自动设置。
图3:
“SelectDatabaseTables”对话框
6、MFC的ODBC应用编程
上述过程虽没有添加任何代码,但却能浏览表中的记录内容,这些MFC
AppWizard创建的功能。
但在MFCAppWizard创建的数据库处理的基本程序框
架中,只提供了程序和数据库记录之间的关系映射,却没有操作的完整界面。
如
果要增加操作功能,还必须加入一些代码。
这时就需要使用MFC提供的ODBC
类:
CDatabase(数据库类)、CRecordSet(记录集类)和CRecordView(可视记
录集类)。
CDatabase类用于提供对数据源的连接,通过它可以对数据源进行操作
CRecordView类用于控制并显示数据库记录,该视图是直接连到一个CRecordSet
对象的表单视图
CRecordSet类是用户最关心的,它为用户提供了对表记录进行操作的许多功
能,如:
查询记录、添加记录、删除记录、修改记录等,并能直接
为数据源中的表映射一个CRecordSet类对象,方便用户的操作。
CRecordSet类对象提供了从数据源中提取出表的记录集,并提供了
2种操作形式:
动态行集(Dynasets)和快照集(Snapshots)。
动态
行集能与其他用户所进行的更改保持同步,而快照集则是数据的一
个静态视图。
这2个形式在记录集被打开时都提供一组记录。
所不
同的是:
当在一个动态行集里滚动一条记录时,由其他用户或应用
程序中的其他记录对该记录所进行的更改会相应地显示出来,而快
照集则不会。
下面从显示记录总数和当前记录号、查询记录、编辑记录等几个方面讨论MFCODBC数据库编程的方法和技巧。
6.1显示记录总数和当前记录号
在“数据库编程”的记录浏览过程中,用户并不能知道表中的记录总数
及当前的记录位置,这就造成了交互的不完善,因此必须将这些信息显示出来。
这时就需要使用CRecordset类的成员函数GetRecordCount和GetStatus,它们分别用来获得表中的记录总数和当前记录的索引,其原型如下:
longGetRecordCount()const;
voidGetStatus(CRecordsetStatus&
rStatus)const;
其中:
参数rStatus是指向下列的CRecordsetStatus结构的对象:
structCRecordsetStatus
{longm_lCurrentRecord;
//当前记录的索引,0表示第一个记录1表示第二个记录
//依次类推,但-1表示第一记录之前,-2表示不确定
BOOLm_bRecordCountFinal;
//记录总数是否是最终结果
};
需注意的是,GetRecordCount函数所返回的记录总数在表打开时或调用Requery函数后是不确定的,因而必须经过下列的代码才能获得最终有效的记录总数:
while(!
m_pSet->
lsEOF())
{m_pSet->
MoveNext();
m_pSet->
GetRecordCount();
}
例:
显示记录信息(总的记录数和当前记录数)
(1)调入前面的“数据库”单文档应用程序
(2)打开MainFrm.cpp文件,将原先的indicators数组修改如下:
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator第一个信息行窗口
ID_SEPARATOR,//statuslineindicator第二个信息行窗口
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
(3)用ClassWizard为CMyView类添加OnCommand消息处理函数,并增加下列代码。
该函数先获得状态栏对象的指针,然后调用SetPaneText函数更新第2个窗格的文本。
CStringstr;
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->
m_pMainWnd;
CStatusBar*pStatus=&
pFrame->
m_wndStatusBar;
if(pStatus)
{
CRecordsetStatusrStatus;
m_pSet->
GetStatus(rStatus);
//获得当前记录信息
str.Format("
当前记录:
%d/总记录:
%d"
1+rStatus.m_lCurrentRecord,
m_pSet->
GetRecordCount());
pStatus->
SetPaneText(1,str);
//更新第2个窗格的文本
}
(4)在CMyView的OnInitialUpdate函数处添加下列代码:
while(!
IsEOF())
MoveFirst();
(5)#include"
MainFrm.h"
(6)将MainFrm.h文件中的保护型变量m_wndStatusBar变成公共变量。
(7)编译并运行,见下面的状态栏中,你若向前翻页,它就变化。
有数据库总条数,和你翻的页数。
6.2查询记录
使用CRecordSet类的成员变量m_strFilter、m_strSort和成员函数Open可以对表进行记录的查询和排序。
示例如下图4所示:
图4:
添加查询控件
(1)在上面项目中,你打开资源栏,点开Dialog,双击IDD_MY_FORM,在学
生表下面,加一静态控件写:
要查询的学号,接着再加一个编辑控件,ID为:
IDC_EDIT_QUERY,再加一个按钮控件,ID号为:
IDC_BUTTON_QUERY
Caption标题处写:
查询
(2)打开MFCClassWizard对话框,为控件IDC_EDIT_QUERY添加CString类型的关联变量m_strQuery。
(3)在View类中添加按钮控件IDC_BUTTON_QUERY的BN_CLICKED消息映射,并加下列代码:
voidCMyView:
:
OnButtonQuery()
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
m_strQuery.TrimLeft();
if(m_strQuery.IsEmpty())
MessageBox("
要查询的姓名不能为空"
);
return;
if(m_pSet->
IsOpen())
Close();
//如果记录集打开,则先关闭
m_strFilter.Format("
stuid='
%s'
"
m_strQuery);
//stuid是xs表的字段名,用来指定查询条件
m_strSort="
name"
;
//name是xs表的字段名,用来按name字段从小到大排序
Open();
if(!
IsEOF())//如果打开记录集,有记录
UpdateData(FALSE);
//自动更新表中控件显示的内容
else
MessageBox("
没有找到你要查找的名字!
}
其中:
m_strFilter和m_strSort是CRecordSet的成员变量,用来执行条件查询和排序。
m_strFilter称为"
过滤字符串"
相当于SQL语句中WHERE后的条件串。
m_strSort称为"
排序字符串"
相当于SQL语句中ORDERBY后的字符串。
若字段的数据类型是文本,则需要在m_strFilter字符串中用单引号将查询的内容括起来;
对于数字,则不需要用单引号。
需要注意的是:
只有在调用Open函数之前设置m_strFilter和m_strSort才能保证查询和排序有效。
如果有多个条件查询,则可以使用AND、OR、NOT来组合,例如:
m_strFilter="
stuid>
='
990103'
ANDstdio<
990101'
需要说明的是,如果查询的结果有多条记录,则可以用CRecordSet类的MoveNext(下移一个记录)、MovePrev(上移一个记录)、MoveFirst(定位到第一个记录)和MoveLast(定位到最后一个记录)等函数来移动当前记录位置进行操作。
(4)编译运行
6.3编辑记录
CRecordset类为用户提供了编辑记录所需要的成员函数,但在编程时还应注意两个方面的内容:
(1)理解“删除”。
CRecordset类的成员函数Delete只是将记录进行“逻辑”删除,而不是“物理”删除。
逻辑删除的记录还可以恢复,而物理删除则不能。
(2)控件与字段数据成员的相互影响。
在MFC创建的数据库处理的应用程序框架中,表的字段总是和系统定义的默认数据成员相关联,例如表xs字段stuid与CMySet的m_stuid相关联。
另外,在表单视图CMyView中添加一些控件用于记录的浏览,其中控件IDC_STU_ID的成员变量也是CMySet的m_stuid,因而控件数据成员与字段数据成员必然相互影响。
合理利用这些影响能简化编程,例如下面的代码是用来增加记录的:
AddNew();
//在表的末尾增加新记录
UpdateData(TRUE);
//将控件中的数据传给字段数据成员
Update();
//将新记录存入数据库
MoveLast();
//将当前记录位置定位到最后一个记录
UpdateData(FALSE);
//将字段数据成员的数据传给控件,即在控件中显示
上述的相互影响有时也给编程带来不便,因为稍不留神就会产生错误。
因此,
在修改和添加记录数据之前,往往设计一个对话框用以获得所需要的数据,然后用该数据进行当前记录的编辑。
这样就能避免它们的相互影响,且保证代码的相对独立性。
1、增加记录
增加记录是使用AddNew函数,但要求数据库必须是以“可增加”的方式打开的。
以下代码是在表的末尾增加新记录:
//在表的末尾增加新记录
SetFieldNull(&
(m_pSet->
m_studentno),FALSE);
//设定m_studentno值不
//为空(NULL)
m_studentno=”21010503”;
…..//输入新的字段值
Requery();
//刷新记录集,这在快照集方式下是必须的
2、删除记录
可以直接使用CRecordSet:
Delete函数来删除记录。
需要说明的是,要使删除操作有效,还需要移动记录函数。
例如下列代码:
CRecordsetStatusstatus;
//建立记录状态对象
GetStatus(status);
//获取当前记录状态
Delete();
//删除当前记录
if(status.m_lCurrentRecord==0)//若当前记录索引号为0(0表示第1条记录)则
//下移一个记录
else
//移到第1个记录处
3、修改记录
函数CRecordSet:
Edit可以用于修改记录,例如:
Edit();
//修改当前记录
m_name=”刘向东”;
//修改当前记录字段值
……
//将修改结果存入数据库
4、撤消操作
如果用户在进行增加或者修改记录后,希望放弃当前操作,则在调用CRecordSet:
Update
函数之前调用CRecordSet:
Move(AFX_MOVE_REFRESH)来撤消操作,便可恢复在增加或修改操作之前的当前记录。
在编写程序时应注意控件与字段数据成员的相互影响。
在MFC创建的数据库处理的应用程序框架中,表的字段总是和系统定义的默认数据成员相关联。
例如:
本程序中,表xs字段stuid(学号)与CMySet指针的m_stuid相关联。
而且,在表单视图CMyView添加用于记录内容显示的一些控件中,在定义其控件变量时,使用的也是m_pSet中的成员变量。
例如编辑框IDC_STU_ID定义的控件变量是m_pSet的m_stuid。
虽然,共用同一个成员变量能简化编程,但有时也给编程带来不便,稍不留神就会产生误操作。
例如以下代码是用于增加一条记录:
//将控件中的数据传给字段数据成员
//将新记录存入数据库
//将当前记录位置定位到最后一个记录
//将字段数据成员的数据传给控件,即在控件中显示。
由于增加和显示记录在同一界面中出现,容易造成误操作。
因此,在修改和添加记录数据之前,往往设计一个对话框用于获得所需要的数据,然后用该数据进行当前记录的编辑。
在表单视图中增加3个按钮:
[添加记录]、[修改记录]、[删除记录],如下图5(书345页图8.20)所示:
。
单击[添加记录]或[修改记录]都将弹出一个如下图6(书345页图8.21)所示的对话框,在对话框中可以进行数据的添加或修改,单击对话框的[确定]按钮则数据有效。
(1)用前面的单文档应用程序:
数据库
(2)切换到项目工作区窗口的ResourceView页面,打开用于表单视图CMyView的对话框资源IDD_MY_FORM。
参看下面图7向表中添加3个按钮:
添加记录(IDC_REC_ADD)、修改记录(IDC_REC_EDIT)和删除记录(IDC_REC_DEL)。
图5:
记录编辑
(3)添加一个对话框资源,打开属性
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ODBC MFC实验指导 MFC 实验 指导