第9章数据库Word格式文档下载.docx
《第9章数据库Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第9章数据库Word格式文档下载.docx(40页珍藏版)》请在冰豆网上搜索。
9.2.2MFC提供的ODBC类
MFC提供了ODBC类:
CDatabase、CRecordSet、CRecordView和CFilelExchange。
(1)CDatabase负责连接数据源,它是针对某个数据库的,CDatabase类对象提供了对数据库的连接,通过它可以对数据源进行操作。
(2)CRecordSet针对数据源中的记录集,负责对记录的操作,CRecordSet类对象提供了从数据源中提取出记录集。
CRecordSet对象通常用于两种形式:
动态行集(dynasets)和快照集(snapshots)。
动态行集能保持与其它用户所做的更改保持同步。
快照集则是数据集的一个静态视图。
每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚动到一条记录时,由其它用户或是你应用程序中的其它记录对该记录所做的更改会相应地显示出来。
(3)CRecordView负责界面,CRecordView类对象能以控制的形式显示数据库记录。
这个视图是直接连接到一个CRecordSet对象的表视图。
(4)CFilelExchange负责CRecordSet与数据源的数据交换。
9.2.3应用ODBC编程
1.使用ODBC类编程的一般步骤
使用ODBC类进行编程,一般步骤如下:
(1)连接数据源。
(2)创建并执行SQL语句。
(3)检查结果记录。
(4)断开数据源。
2.数据记录的基本操作
假设定义子数据记录集:
CRecordSet*m_pSet;
m_pSet=newCRecordSet();
则将数据记录进行增加、删除和修改的方法如下:
(1)增加记录
使用AddNew()函数增加记录,但要求数据库必须是以允许增加的方式打开,增加一条记录的关键语句如下:
m_pSet->
AddNew();
//增加记录
……//输入新的字段值
m_pSet->
Update();
//将新记录存入数据库
m_pSet->
Requery()//重建记录集
(2)删除记录
直接使用Delete()函数,并且在调用Delete()函数之后不需调用Update()函数:
Delete();
//删除记录
Requery();
//重建记录集
(3)修改记录
修改记录使用Edit()函数,关键语句如下:
Edit();
//修改当前记录
……//修改当前记录字段值
9.2.4创建数据源(DSN)
前面提到过ODBC是一个方便的接口,它和具体用哪种数据库程序创建的数据库没关系,但要访问数据库,就必须为数据库指定一个唯一的名称,即添加ODBC数据源,否则应用程序将无法访问。
假定用户已创建了一个名为myplayer.mdb的Access数据库,并存放在D:
\MyVc目录下。
则创建ODBC数据源的步骤如下:
(1)在控制面板中,双击“管理工具”下的“数据源(ODBC)”图标打开“ODBC数据源管理器”,并选择用户DSN(即DataSource),如图9-2所示。
可以看到在用户数据源里有很多的驱动程序列表,在此向里面添加我们需要的数据源。
图9-2DSN数据源管理器
(2)单击“添加(D)…”按钮,显示“创建新数据源”对话框,选择“DrivedoMicrosoftAccess(*mdb)”,添加MicrosoftAccess驱动程序,如图9-3所示。
图9-3创建新数据源对话框
(3)单击“完成”按钮,在弹出的“ODBCMicrosoftAccess安装”对话框中(如图9-5),输入要添加的数据源名字,并加入必要的说明,点击“选择”按钮,会弹出“选定数据库”对话框,我们选择存放myplayer.mdb文件的驱动器和目录,再选中myplayer.mdb文件,如图9-4所示。
图9-4“选定数据库”对话框
图9-5“ODBCMicrosoftAccess安装”对话框
(4)点击“确认”,返回“ODBCMicrosoftAccess安装”对话框,如图9-5所示。
(5)点击“确认”按钮,返回“ODBC数据源管理器”,新添加的数据源显示在用户数据源列表中,如图9-6所示,。
图9-6添加数据源后的“ODBC数据源管理器”
(6)点击“确认”按钮,就完成了一个ODBC数据源的添加工作。
9.2.5在ODBC应用程序中注册数据源
通常,在使用ODBC之前,用户需要启动ODBC数据源管理器,对数据源进行注册,这对于用户而言实在麻烦,下面将介绍在ODBC应用程序中注册数据源方法。
在ODBC应用程序中注册数据源打开记录集的步骤如图9-7所示。
图9-7注册数据源的步骤
在ODBC应用程序中注册数据源的核心是调用:
:
SQLConfigDataSource()函数注册数据源。
该函数原型为:
BOOLSQLConfigDataSource(
HWNDhwndParent,
WORDfRequest,
LOCSTRlpszDriver,
LOCSTRlpszAttributes);
例如,注册一个数据源为msong,且数据源文件绝对路经为D:
\\MyVC\\msong.mdb的MicrosoftAccess数据源。
调用方法为:
SQLConfigDataSource(NULL,//不需要弹出对话框
ODBC_ADD_DSN,//添加数据源
"
MicrosoftAccessDriver(*.mdb)"
//驱动程序名
DSN=msong\0"
//数据源名称
Description=Thisisasample\0"
//数据源的说明
FileType=MicrosoftAccess\0"
//数据源文件类型说明
DBQ=D:
\\MyVC\\msong.mdb\0"
//数据源文件绝对路经
MaxScanRows=9\0"
//在根据现有数据设置列的
//数据类型时所要扫描的行数。
可以为1到16,默认值
//为9;
如果设置为0,将扫描所有行。
如果数字超出界限,
//会返回一个错误
);
9.3多媒体数据库
本节将利用MFC提供的ODBC类,开发一个简易多媒体数据库程序,具有数据记录的编辑和浏览功能,如图9-1所示。
9.3.1创建应用程序项目
创建一个基于单文档界面(SDI)的odbc程序,创建项目的步骤如下:
(1)启动VisualC++2005。
创建一个项目,名称为“odbc”,在“应用程序类型”对话框中,选择“Singledocument”,即创建一个基于单文档的应用程序。
(2)默认“下一步”,直至“数据库支持”对话框,选择“不支持文件的数据库视图”单选项,客户端类型选择“ODBC”,如图9-8所示。
图9-8设置数据库支持
(6)单击“数据源”按钮,弹出“选择数据源”对话框。
选“机器数据源”页,选取mysong数据源(§
9.2.4节创建的数据源),如图9-9所示。
图9-9DatabaseOptions对话框
(7)单击“确定”按钮,将弹出“登陆”对话框。
“登陆名称”和“密码”不填,如图9-10所示。
再单击“确定”按钮,弹出“选择数据库对象”对话框中,将列出mysong数据源中的所有数据表,选择你要操作的数据表“Table1”,如图9-11所示。
图9-10“登陆”对话框
图9-11SelectDatabaseTables对话框
(9)单击“确定”按钮。
此时VisualC++将返回到图9-9的对话框,至此,数据源设置完毕。
(9)单击“下一步”按钮。
在后续的各向导对话框中保留其缺省设置(在此略),VisualC++就会创建支持数据库操作的odbc工程以及相关的所有文件。
9.3.2可视化设计
设计主窗口界面的步骤如下:
(1)在“资源视图”窗体中,把odbc.rc扩展开,然后再扩展Dialog,最后,双击“IDD_ODBC_FORM”项,VisualStudio显示出处于设计状态的“IDD_ODBC_FORM“对话框。
(2)在“IDD_ODBC_FORM”对话框中,根据表9-1中的定义编辑对话框资源,设计完毕的对话框如图9-12所示。
表9-1IDD_ODBC_FORM对话框中各控件属性
对象
属性
属性值
EditControl
ID,Border,Modalframe
IDC_EDIT_ID,True,True
IDC__EDIT_NAME,True,True
IDC__EDIT_SINGER,True,True
IDC__EDIT_WRITER,True,True
IDC__EDIT_POSITION,True,True
StaticText
ID,Caption
CenterImage
Modalframe
STATIC,编号:
True
True
……
STATIC,位置:
Button
IDC_RECORD_ADD,添加记录
IDC_RECORD_DEL,删除记录
IDC_RECORD_EDIT,修改记录
图9-12设计完后的“IDD_ODBC_FORM”对话框
9.3.3为各EditControl编辑框引入变量
为了在浏览数据记录时,各编辑框显示当前记录对应的字段,必须为它们引入变量。
为编辑控件引入变量的操作步骤如下:
(1)选择IDC_EDIT_ID编辑框。
右键点击“添加变量”,弹出“添加成员变量向导”对话框
(2)按下列表格为各控件引入变量,如表9-2所示。
表9-2各EditControl控件关联变量
控件ID
变量类型
变量名
IDC_EDIT_ID
UNIT
m_ID
IDC_EDIT_NAME
CString
m_name
IDC_EDIT_SINGER
m_singer
IDC_EDIT_WRITER
m_writer
IDC_EDIT_POSITION
m_position
9.3.4添加消息响应函数
1.为“记录(R)”菜单下的各菜单项添加消息响应函数
操作步骤如下:
(1)在“资源视图”窗体,展开Menu,双击IDR_MAINFRAME,弹出菜单编辑窗体。
(2)选中“第一个记录(F)”菜单项,右键点击“添加事件处理程序”,弹出“事件处理程序向导”对话框。
类列表选COdbcView,消息类型选COMMAND,函数处理程序名称选OnRecordFirst。
(3)单击“添加编辑”按钮,就为“第一个记录(F)”菜单项添加消息响应函数OnRecordFirst()。
同时也就为工具条上记录移动的对应按钮IDC_RECORD_FIRST添加了消息响应函数。
因为它们有相同的ID标识:
IDC_RECORD_FIRST。
稍后在写入代码
(4)完全类似,重复
(2)-(3)步的方法,为“记录(R)”菜单下的其它记录移动菜单项添加消息响应函数:
OnRecordLast()、OnRecordNext()和OnRecordPrev()。
2.为“添加记录”按钮的BN_CLICKED事件添加消息响应函数
(1)在“资源视图”窗体,展开Dialog,双击IDD_ODBC_FORM,弹出Form窗体。
(2)选中“添加记录”按钮项,右键点击“添加事件处理程序”,弹出“事件处理程序向导”对话框。
类列表选COdbcView,消息类型选BN_CLICKED,函数处理程序名称改为OnRecordAdd。
(3)单击“添加编辑”按钮,就为“添加记录”按钮添加消息响应函数名OnRecordAdd。
(4)同理为“删除记录”IDR_RECORD_DEL和“修改记录”IDR_RECORD_EDIT按钮添加消息响应函数OnRecordDel()和OnRecordEdit()。
9.3.5编写程序代码
1.在COdbcView类中添加自定义函数
(1)自定义函数原型声明
在“类视图”窗体,选中COdbcView类,右键单击“添加”/“添加函数”,弹出“添加成员函数向导”窗体。
如图9-13所示
图9-13添加自定义函数
打开odbcView.h文件,看到自定义函数的声明:
//odbcView.h:
CodbcView类的接口
#pragmaonce
classCodbcSet;
classCodbcView:
publicCRecordView
{
……//省略
public:
afx_msgvoidOnRecordEdit();
voidMyUpdateData(void);
//自动生成自定义函数声明
};
#ifndef_DEBUG//odbcView.cpp中的调试版本
inlineCodbcDoc*CodbcView:
GetDocument()const
{returnreinterpret_cast<
CodbcDoc*>
(m_pDocument);
}
#endif
(2)添加自定义函数体
该函数的功能就是从打开记录集中,将当前记录指针所指的记录传递给主窗口对话框中的各编辑框的关联变量,并更新屏幕。
从而,使当前记录指针所指的记录显示在各编辑框中。
打开odbcView.cpp文件,在程序末尾,找到自定义函数体,添加如下代码:
voidCodbcView:
MyUpdateData(void)
m_name=m_pSet->
m_name;
m_ID=m_pSet->
m_ID;
m_singer=m_pSet->
m_singer;
m_writer=m_pSet->
m_writer;
m_position=m_pSet->
m_position;
UpdateData(false);
}
2.为“记录(R)”菜单下的各菜单项的消息响应函数编写代码
为各记录移动消息响应函数添加如下代码:
OnRecordFirst()
//TODO:
在此添加命令处理程序代码
m_pSet->
MoveFirst();
//移动记录集指针至第一条记录处
MyUpdateData();
//更新记录显示
OnRecordPrev()
MovePrev();
//移动记录集指针至前一条记录处
OnRecordNext()
MoveNext();
//移动记录集指针至下一条记录处
//更新记录显示
OnRecordLast()
MoveLast();
//移动记录集指针至最后一条记录处
3.修改视类成员函数OnInitialUpdate()
在OnInitialUpdate()中添加创建并打开数据集代码。
OnInitialUpdate()
{m_pSet=&
GetDocument()->
m_odbcSet;
CRecordView:
OnInitialUpdate();
try
{m_pSet=newCodbcSet();
Open();
MyUpdateData();
catch(CDBException*pe)
{AfxMessageBox(pe->
m_strError);
pe->
}
4.为函数OnRecordAdd()、OnRecordDel()和OnRecordEdit()编写代码
将各编辑框的内容传递给各关联变量,再将各变量传递给数据集指针所指记录各字段,更新记录集。
OnRecordAdd()
在此添加控件通知处理程序代码
try
{m_pSet->
//将各编辑框的内容传递给各关联变量
UpdateData(true);
//将各变量传递给数据集指针所指记录各字段
m_ID=m_ID;
m_name=m_name;
m_singer=m_singer;
m_writer=m_writer;
m_position=m_position;
}
OnRecordDel()
OnRecordEdit()
{
9.3.6查看结果
按如下步骤操作,观察结果。
(1)编译、连接,重新生成可执行程序,然后运行odbc.exe。
(2)单击工具栏上的记录移动按钮或点击相应菜单项,各EditBox框内将显示对应的记录数据。
如图9-1所示。
(3)编辑各字段数据,单击“修改记录”或“添加记录”按钮,将完成相应功能。
(4)单击“删除记录”按钮,界面上显示的当前记录就被删除。
9.3.7相关知识
1.与数据库的连接
本例中的COdbcSet类是CRecordSet的派生类,这个类对于连接数据库操作非常重要。
通过ODBC访问数据库的操作通过成员函数GetDefaultConnect实现,本例中开始设置的数据库源连接体现在OdbcSet.cpp中的如下代码:
CStringCodbcSet:
GetDefaultConnect()
return_T("
DSN=myplayer;
DBQ=F:
\\myplayer.mdb;
DriverId=25;
FIL=MSAccess;
MaxBufferSize=2048;
PageTimeout=5;
UID