《VC++第10章 VC++数据库编程.ppt》由会员分享,可在线阅读,更多相关《VC++第10章 VC++数据库编程.ppt(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第10章章VC+数据库编程数据库编程数据库访问技术数据库访问技术(四种四种)ODBC接口访问数据库接口访问数据库*CRecordset类访问类访问ODBC数据库的数据源数据库的数据源*数据库应用程序的实现数据库应用程序的实现数据库访问技术数据库访问技术lODBC(Open DataBase Connectivity,开放数据库连接,开放数据库连接)是一种标准的基于是一种标准的基于SQL的接口,提供了应用程序和数据库之间的的接口,提供了应用程序和数据库之间的接口。用户的程序可以通过调用接口。用户的程序可以通过调用ODBC驱动管理器中的相应驱动驱动管理器中的相应驱动程序达到管理数据库的目的。解决
2、了数据库之间的不兼容问题。程序达到管理数据库的目的。解决了数据库之间的不兼容问题。使得任何一个数据库都可以通过使得任何一个数据库都可以通过ODBC驱动器与指定的驱动器与指定的DBMS相相联。访问数据库时,是由联。访问数据库时,是由ODBC管理器将应用程序的数据库访问管理器将应用程序的数据库访问请示传递给相应的数据库驱动程序,驱动程序再用请示传递给相应的数据库驱动程序,驱动程序再用SQL语句完成语句完成DBMS的访问任务。的访问任务。lDAO(Data Access Objects,数据访问对象,数据访问对象)DAO提供了一种通过程序代码创建和操作数据库的机制,多个提供了一种通过程序代码创建和操
3、作数据库的机制,多个DAO构成一个体系结构,在这个结构中,各个构成一个体系结构,在这个结构中,各个DAO对象协同工作。对象协同工作。DAO使用使用Microsoft Jet提供的数据库访问对象集直接访问提供的数据库访问对象集直接访问DBMS,速度比,速度比ODBC要快。要快。数据库访问技术数据库访问技术lOLE DB(Object Link and Embedding DataBase,对象,对象链接和嵌入数据库链接和嵌入数据库)是是VC+提供的基于提供的基于COM接口的数据库应用程序开发新技术。它接口的数据库应用程序开发新技术。它为所有的文件系统(包括关系型数据库和非关系型数据库)都提为所有
4、的文件系统(包括关系型数据库和非关系型数据库)都提供了统一的接口,供了统一的接口,VC+中提供了中提供了ATL模板(底层接口)用于设计模板(底层接口)用于设计OLE DB数据库应数据库应用程序,以避免直接使用用程序,以避免直接使用OLE DB技术设计数据库应用程序需要技术设计数据库应用程序需要大量代码的缺点。大量代码的缺点。lADO(ActiveX Data Objects,ActiveX数据对象数据对象)ADO技术是基于技术是基于OLE DB的访问接口,属于数据库访问的高层接的访问接口,属于数据库访问的高层接口。口。该技术封装了该技术封装了OLE DB的接口,定义了的接口,定义了ADO对象,
5、简化了数据库对象,简化了数据库应用程序的开发。应用程序的开发。MFC ODBC的构成的构成lODBC是一种使用是一种使用SQL的程序设计接口,使用的程序设计接口,使用ODBC能使用户编写数据库应能使用户编写数据库应用程序变得容易简单,避免了与数据库相连接的复杂性。用程序变得容易简单,避免了与数据库相连接的复杂性。l应用程序(最上层)应用程序(最上层)lODBC管理器:位于管理器:位于控制面板l驱动程序管理器驱动程序管理器:ODBC32.dll l不同的不同的ODBC驱动程序:对应不同的数据库驱动程序:对应不同的数据库l具体的数据源(最底层)具体的数据源(最底层)MFC ODBC类类lCData
6、base(数据库)(数据库)类:类:一个对象代表了一个与数据源的链接,通过它可以一个对象代表了一个与数据源的链接,通过它可以对数据源进行操作。对数据源进行操作。一个数据源就是一个由数据库管理系统所支持的数一个数据源就是一个由数据库管理系统所支持的数据库实例。据库实例。要想建立与数据源的连接,必须创建要想建立与数据源的连接,必须创建Cdatabase对对象,然后用象,然后用Open()函数或函数或OpenEx()函数初始化此对函数初始化此对象。象。一个应用程序可以存在一个或多个一个应用程序可以存在一个或多个CDatabase对象,对象,用来连接一个或多个数据源;也允许同一个数据源用来连接一个或多
7、个数据源;也允许同一个数据源对应多个连接。对应多个连接。MFC ODBC类类lCRecordSet(记录集)类:(记录集)类:一个对象代表了一组从数据源中查询出来的一个对象代表了一组从数据源中查询出来的记录记录-记录集,负责对记录的操作记录集,负责对记录的操作.l快照记录集(snapshots):是数据的一个静态视图l动态记录集(dynasets):能与其他用户所做的更改保持同步使使用用记记录录集集对对象象,首首先先应应建建立立与与数数据据源源的的连连接接,这这时时应应当当创创建建并并初初始始化化CDatabaseCDatabase对对象象,然然后后将将创创建建的的CDatabaseCData
8、base对对象象的的指指针针传传给给CRecordsetCRecordset对对象象的的构构造造函函数数,这这样样记记录录对对象象创创建建成成功功,最最后后使使用用Open()Open()函函数数对数据源进行数据查询。对数据源进行数据查询。MFC ODBC类类lCRecordView(可视记录集)类:(可视记录集)类:CRecordView对象是在控件中显示数据库记对象是在控件中显示数据库记录的视图对象,是直接连到一个录的视图对象,是直接连到一个CRecordSet对象上的表单视图。对象上的表单视图。负责界面,以视图形式显示数据库记录负责界面,以视图形式显示数据库记录lCFileExchang
9、e:负责:负责CRecordSet与数据源与数据源的数据交换的数据交换CDatabase 类的成员类的成员l用用CDatabase类建立与数据源的连接:类建立与数据源的连接:创建创建CDatabase类对象类对象调用调用Open()函数或函数或OpenEx()函数初始化此对象函数初始化此对象调用调用Close()函数断开与当前数据源的连接函数断开与当前数据源的连接l用用CDatabase类实现事务处理类实现事务处理CRecordset类的数据成员类的数据成员lCRecordset对象代表了一组从数据源查询出来的记录,对象代表了一组从数据源查询出来的记录,称为记录集。称为记录集。CRecords
10、et类的成员函数类的成员函数CRecordset类的成员函数类的成员函数1、添加记录、添加记录l使用使用CRecordSet类的类的AddNew函数,并且数据函数,并且数据库是以允许增加的方式打开库是以允许增加的方式打开l基本步骤:基本步骤:打开记录集,其方式为允许增加记录打开记录集,其方式为允许增加记录调用调用AddNew()函数函数设置新记录的域值设置新记录的域值调用调用Update()函数函数,使新添加的记录生效使新添加的记录生效2、修改记录、修改记录l使用使用CRecordSet类的类的Edit函数,并且数据库是函数,并且数据库是以允许修改的方式打开以允许修改的方式打开l基本步骤:基本
11、步骤:确认记录集可以修改确认记录集可以修改定位到希望修改的记录定位到希望修改的记录调用调用Edit()函数函数设置新记录的域值设置新记录的域值调用调用Update()函数函数,使修改生效使修改生效3、删除记录、删除记录l使用使用CRecordSet类的类的Delete函数,并且数据库是以允函数,并且数据库是以允许修改的方式打开许修改的方式打开l基本步骤:基本步骤:确认记录集可以修改确认记录集可以修改定位到希望删除的记录定位到希望删除的记录调用调用Delete()函数函数定位到另一条记录定位到另一条记录l删除记录无需调用删除记录无需调用Update()函数,且删除的记录仍然存函数,且删除的记录仍
12、然存在于记录集中。当在记录集中进行记录定位时,必须调在于记录集中。当在记录集中进行记录定位时,必须调用函数用函数IsDelete()以判断该记录是否已被删除以判断该记录是否已被删除.4、记录查询、记录查询l可以使用可以使用CRecordSet:Open()和和CRecordSet:Requery()成员函数实现成员函数实现.l使用成员变量使用成员变量m_strFilter查询查询,该成员用于存该成员用于存放放SQL语句中语句中WHERE以后的查询条件以后的查询条件,基本代基本代码如下码如下:m_pSet-m_strFilter=“年龄年龄30”;m_pSet-Requery();l使用使用SQ
13、L语句查询语句查询,基本代码如下基本代码如下:LPCTSTR strSQL;/strSQL为包含查询条件的为包含查询条件的SQL语句语句 m_pSet-Open(strSQL);Select*From 职员档案职员档案Where 年龄年龄305、记录排序、记录排序l可以通过记录集类的可以通过记录集类的m_strSort成员变量实现,成员变量实现,基本代码为:基本代码为:m_pSet-m_strSort=“年龄年龄”;m_pSet-Requery();Select*From 职员档案职员档案Order By 年龄年龄数据库的操作数据库的操作l主要包括:主要包括:添加记录添加记录修改记录修改记录删
14、除记录删除记录记录查询记录查询记录排序记录排序l通过记录集类的成员函数可以方便的实现数据通过记录集类的成员函数可以方便的实现数据库的操作功能库的操作功能组合查询和排序组合查询和排序l通过记录集类的通过记录集类的m_strFilter和和m_strSort成员成员变量变量,可以实现对数据库的组合查询和排序可以实现对数据库的组合查询和排序l基本代码如下基本代码如下:m_pSet-m_strSort=“部门部门”;m_pSet-m_strFilter=“年龄年龄30”;m_pSet-Requery();Select*From 职员档案职员档案Where 年龄年龄30Order By 部门部门数据库应
15、用程序的实现数据库应用程序的实现创建一个支持创建一个支持ODBC数据库的数据库的SDI应用程序:应用程序:u可以检索可以检索ODBC数据库中的记录;数据库中的记录;u允许用户更新、添加和删除记录;允许用户更新、添加和删除记录;u对记录的排序、查找等。对记录的排序、查找等。开发步骤开发步骤l准备数据库准备数据库l创建并注册数据源创建并注册数据源 l创建数据库应用框架创建数据库应用框架 l设计记录操作界面设计记录操作界面 l更新记录更新记录 l排序和筛选排序和筛选 创建数据库创建数据库l设计数据库设计数据库 用用Microsoft Access创建数据库创建数据库“职员档案职员档案.mdb”,其中
16、包含一其中包含一个表个表“职员档案职员档案”序号序号字段名称字段名称数据类型数据类型字段大小字段大小1序号序号自动编号自动编号长整型长整型2姓名姓名文本文本103性别性别文本文本24年龄年龄整型整型25籍贯籍贯文本文本206学历学历文本文本107职务职务文本文本108部门部门文本文本10l打开打开Microsoft Access,在启动首,在启动首画面中选择画面中选择“空空Access数据库数据库(B)”l单击单击“确定确定”按钮按钮后,在弹出的后,在弹出的“文文件新建数据库件新建数据库”对对话框中输入或选择话框中输入或选择文件名、文件类型文件名、文件类型和保存路径。和保存路径。l单击单击“创
17、建创建”按钮,按钮,弹出弹出“职员档案:数职员档案:数据库据库”对话框,在左对话框,在左侧的侧的“对象对象”列表框列表框中选择中选择“表表”,在右,在右侧的列表框中选择侧的列表框中选择“使用设计器创建表使用设计器创建表”l单击工具栏上的单击工具栏上的“设设计计”按钮,或者双击按钮,或者双击“使用设计器创建表使用设计器创建表”,弹出,弹出“表表1:表:表”对话框,开始设计对话框,开始设计一个职员档案数据表。一个职员档案数据表。使用工具栏上的使用工具栏上的“主主键键”(钥匙形状)按(钥匙形状)按钮将钮将“序号序号”设为主设为主键。键。l关闭并保存该表,在关闭并保存该表,在“另存为另存为”对话框中将
18、表对话框中将表命名为命名为“职员档案职员档案”。这样,在这样,在“职员档案:职员档案:数据库数据库”对话框的右侧对话框的右侧列表框中就增加了一个列表框中就增加了一个名为名为“职员档案职员档案”的表的表l双击打开双击打开“职员档案职员档案”表并编辑,如下图所示:表并编辑,如下图所示:创建并注册数据源创建并注册数据源lODBC管理器的使用管理器的使用用户用户DSNl用户数据源只对当前用户可见,而且只能用于当前机器上用户数据源只对当前用户可见,而且只能用于当前机器上 系统系统DSNl系统数据源对当前机器上的所有用户可见系统数据源对当前机器上的所有用户可见 文件文件DSNl文件数据源可以由安装了相同驱
19、动程序的用户共享文件数据源可以由安装了相同驱动程序的用户共享 l数据源创建示例数据源创建示例创建并注册数据源创建并注册数据源lwinXP:“控制面板控制面板”“管理工具管理工具”双双击击“数据源数据源(ODBC)”,打开,打开“ODBC数据源管理器数据源管理器”。l选择选择“用户用户DSN”,单击,单击“添加添加”按钮,按钮,弹出弹出“创创建新数据源建新数据源”对话对话框,选择数据库驱框,选择数据库驱动程序,动程序,l单击单击“完成完成”,弹出,弹出“ODBC Microsoft Access安装安装”对话对话框,框,l给数据源命名给数据源命名创建并注册数据源创建并注册数据源l单击单击“选择选
20、择”按钮按钮弹出弹出“选择数据库选择数据库”对话框,选择已对话框,选择已经建立的数据库文经建立的数据库文件件“职员档案职员档案.mdb”,l“确定确定”,回到,回到“ODBC Microsoft Access安装安装”对对话框话框l“确定确定”,回到回到“ODBC数据源管理器数据源管理器”,可以发现,可以发现“职员职员档案档案”已经作为数据已经作为数据源加入到列表中源加入到列表中l“确定确定”,数据源设,数据源设置完毕置完毕创建数据库应用程序框架创建数据库应用程序框架l创建一个创建一个SDI应用程序应用程序EmployeeDB,AppWizard的的选项设置:选项设置:step 2:选择选择D
21、atabase view with file support,数据源选择对话框数据源选择对话框l在在“Select Database Tables”对话框中对话框中,选择数据选择数据库表库表l单击单击OK返回返回l其余各步保留缺省设其余各步保留缺省设置置类信息类信息l应用程序自动添加了一个应用程序自动添加了一个CEmployeeDBSet类,通过建立该类对类,通过建立该类对象的指针象的指针m_pSet,实现视图表单和记录集之间的联系,使得记,实现视图表单和记录集之间的联系,使得记录集中的查询结果能够很容易地显示在视图表单上,该功能是通录集中的查询结果能够很容易地显示在视图表单上,该功能是通过重
22、载过重载 CEmployeeDBView类的类的OnInitialUpdate()函数实现的函数实现的void CEmployeeDBView:OnInitialUpdate()m_pSet=&GetDocument()-m_employeeDBSet;定义在定义在CEmployeeDBDoc类中的成员类中的成员public:CEmployeeDBSet m_employeeDBSet;定义在定义在CEmployeeDBView类中的成员类中的成员public:CEmployeeDBSet*m_pSet;设计主窗体设计主窗体l在工作区的在工作区的ResourView中中,在在Dialog文件夹
23、下的文件夹下的IDD_EMPLOYEEDB_FORM上双击上双击,打开对话框编辑器打开对话框编辑器,编辑对话编辑对话框资源框资源l控件控件 ID序号序号对应的编辑框对应的编辑框 ID_EID 姓名姓名对应的编辑框对应的编辑框 ID_ENAME 性别性别对应的编辑框对应的编辑框 ID_ESEX 年龄年龄对应的编辑框对应的编辑框 ID_EAGE 籍贯籍贯对应的编辑框对应的编辑框 ID_EADDRESS 学位学位对应的编辑框对应的编辑框 ID_EDEGREE 职务职务对应的编辑框对应的编辑框 ID_EFUNCTION 部门部门对应的编辑框对应的编辑框 ID_EDEPARTMENT 主窗体主窗体修改记
24、录集字段名修改记录集字段名l在在EmployeeDBSet.h文件中修改字段名文件中修改字段名class CEmployeeDBSet:public CRecordsetpublic:/Field/Param Data/AFX_FIELD(CEmployeeDBSet,CRecordset)long m_ID;CStringm_name;CStringm_sex;int m_age;CStringm_address;CStringm_degree;CStringm_function;CStringm_department;/AFX_FIELDEmployeeDBSet类类class CEmpl
25、oyeeDBSet:public CRecordsetpublic:CEmployeeDBSet(CDatabase*pDatabase=NULL);DECLARE_DYNAMIC(CEmployeeDBSet)/Field/Param Data/AFX_FIELD(CEmployeeDBSet,CRecordset)long m_ID;CStringm_name;CStringm_sex;int m_age;CStringm_address;CStringm_degree;CStringm_function;CStringm_department;/AFX_FIELD/Overrides/C
26、lassWizard generated virtual function overrides/AFX_VIRTUAL(CEmployeeDBSet)public:virtual CString GetDefaultConnect();/Default connection stringvirtual CString GetDefaultSQL();/default SQL for Recordsetvirtual void DoFieldExchange(CFieldExchange*pFX);/RFX support/AFX_VIRTUAL/Implementation#ifdef _DE
27、BUGvirtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;#endif;记录集字段数据成员CDatabase对象指针构造函数构造函数CEmployeeDBSet:CEmployeeDBSet(CDatabase*pdb):CRecordset(pdb)/AFX_FIELD_INIT(CEmployeeDBSet)m_ID=0;m_name=_T();m_sex=_T();m_age=0;m_address=_T();m_degree=_T();m_function=_T();m_department=_
28、T();m_nFields=8;/AFX_FIELD_INITm_nDefaultType=snapshot;记录集类型将控件与字段相关联将控件与字段相关联l添加成员变量添加成员变量创建主窗体创建主窗体l编译、运行可浏览数据库中的记录编译、运行可浏览数据库中的记录创建连接创建连接l默认的数据源默认的数据源:CString CEmployeeDBSet:GetDefaultConnect()return _T(ODBC;DSN=职员档案职员档案);l默认的默认的SQL语句语句:CString CEmployeeDBSet:GetDefaultSQL()return _T(职员档案职员档案);用于
29、获得定义了数据源类型和数据源名的连接字符串 定义SQL语句的字符串,本例的SQL语句定义了查询一张表的完整记录,对应的SQL语句:Select*From 职员档案职员档案记录集与数据库的数据交换记录集与数据库的数据交换void CEmployeeDBSet:DoFieldExchange(CFieldExchange*pFX)/AFX_FIELD_MAP(CEmployeeDBSet)pFX-SetFieldType(CFieldExchange:outputColumn);RFX_Long(pFX,_T(序号序号),m_ID);RFX_Text(pFX,_T(姓名姓名),m_name);RF
30、X_Text(pFX,_T(性别性别),m_sex);RFX_Int(pFX,_T(年龄年龄),m_age);RFX_Text(pFX,_T(籍贯籍贯),m_address);RFX_Text(pFX,_T(学位学位),m_degree);RFX_Text(pFX,_T(职务职务),m_function);RFX_Text(pFX,_T(部门部门),m_department);/AFX_FIELD_MAP更新记录(记录集的编辑函数)更新记录(记录集的编辑函数)lAddNew()向记录集添加一条新记录向记录集添加一条新记录lDelete()删除当前记录删除当前记录lEdit()允许编辑当前记录允
31、许编辑当前记录lUpdate()将当前记录修改存入数据库将当前记录修改存入数据库lCancelUpdate()取消更新操作取消更新操作lRequery()重新执行重新执行SQL语句,以刷新记录集语句,以刷新记录集添加新记录添加新记录long CEmployeeDBSet:GetMaxID()MoveLast();/移动到最后一条记录移动到最后一条记录return m_ID;/返回最后一条记录的返回最后一条记录的IDl向记录集类向记录集类CEmployeeDBSet添加计算下一个添加计算下一个ID号的公号的公有成员函数有成员函数GetMaxID()添加新记录添加新记录l向“记录”菜单添加新的菜单
32、项添加新记录的消息处理函数添加新记录的消息处理函数void CEmployeeDBView:OnRecordAdd()CRecordset*pSet=OnGetRecordset();/获得一个记录集指针获得一个记录集指针 if (pSet-CanUpdate()&!pSet-IsDeleted()/确保当前记录的确保当前记录的修改保存修改保存 pSet-Edit();if (!UpdateData()return;pSet-Update();long m_lNewID=m_pSet-GetMaxID()+1;/为新记录得到为新记录得到ID号号 m_pSet-AddNew();/添加新记录添加
33、新记录 m_pSet-m_ID=m_lNewID;/设置新记录设置新记录ID号号 m_pSet-Update();/保存新记录保存新记录 m_pSet-Requery();/刷新记录集刷新记录集 m_pSet-MoveLast();/移动到新记录上移动到新记录上 UpdateData(FALSE);/刷新窗体刷新窗体删除记录删除记录void CEmployeeDBView:OnRecordDelete()/TODO:Add your command handler code hereif (MessageBox(真的要删除该记录吗真的要删除该记录吗?,删除记录删除记录,MB_YESNO|MB_
34、ICONQUESTION)=IDYES )m_pSet-Delete();/删除当前记录删除当前记录 m_pSet-MoveNext();/移到下一记录移到下一记录 if(m_pSet-IsEOF()/删除记录为最后一条记录处理删除记录为最后一条记录处理 m_pSet-MoveLast();if(m_pSet-IsBOF()/删空记录集处理删空记录集处理 m_pSet-SetFieldNull(NULL);UpdateData(false);/更新控件显示更新控件显示修改记录修改记录void CEmployeeDBView:OnRecordEdit()/TODO:Add your comman
35、d handler code hereif(m_pSet-CanUpdate()&!m_pSet-IsDeleted()/确保当前记录的修改保存确保当前记录的修改保存 m_pSet-Edit();if(!UpdateData()return;m_pSet-Update();UpdateData(FALSE);/刷新窗体刷新窗体记录排序记录排序void CEmployeeDBView:OnRecordSort()/TODO:Add your command handler code herem_pSet-m_strSort=年龄年龄;m_pSet-Requery();/重新查询重新查询Updat
36、eData(FALSE);/刷新窗体刷新窗体查询查询void CEmployeeDBView:OnRecordFilter()/TODO:Add your command handler code herem_pSet-m_strFilter=年龄年龄30;m_pSet-Requery();/重新查询记录集重新查询记录集UpdateData(false);/更新控件显示更新控件显示程序的进一步改进程序的进一步改进只需将工具栏按钮与只需将工具栏按钮与IDM_RECORD_NEW菜单菜单ID相关联相关联l通过工具栏按钮实现添加、编辑和删除记录l界面用按钮实现添加、编辑和删除记录只需将命令按钮与只需将命令按钮与IDM_RECORD_NEW菜单菜单ID相关联相关联实践实践l独立设计一个简单的数据库应用系统,用于管独立设计一个简单的数据库应用系统,用于管理旅行社的游客信息管理。需要知道信息一般理旅行社的游客信息管理。需要知道信息一般有:身份证号,姓名,性别,住址,电话,参有:身份证号,姓名,性别,住址,电话,参加的旅游项目编号,团队编号等,程序要有浏加的旅游项目编号,团队编号等,程序要有浏览、修改、添加、删除游客信息的功能。览、修改、添加、删除游客信息的功能。