Visual C++ 数据库编程.doc_第1页
Visual C++ 数据库编程.doc_第2页
Visual C++ 数据库编程.doc_第3页
Visual C++ 数据库编程.doc_第4页
Visual C++ 数据库编程.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章 数据库编程 用数据库方式来管理日常生活中大量的信息已变得越来越重要,并出现了许多数据库管理系统,如Microsoft Access,Microsoft SQL Server,Oracle Server等,尽管这些系统能进行数据库的管理,但却不能开发出其它功能强大的Windows应用程序。而Visual C +能将关系数据库与面向对象的编程方法有机地结合起来,使得数据库处理和应用程序开发都能很好地兼顾。Visual c+6.0为用户提供了ODBC、DAO及OLE DB三种数据库方式,这三种方式中最简单、最常用的是ODBC。因而我们重点介绍MFC的ODBC编程方法和技巧,并介绍一些用于数据库的ActiveX控件。一、MFC的ODBC过程ODBC(Open Database Connectivity 开放数据库连接),提供了应用程序接口(API),使得任何一个数据库都可以通过ODBC驱动器与指定的DBMS相联。用户的程序就可以通过调用ODBC驱动管理器中相应的驱动程序达到管理数据库的目的。用MFC Appwizard(exe)创建一个数据库处理的SDI/MDI程序,只需在向导的第二步中选中“Database view without file support”或“Database view with filesupport”即可。当然,在创建之前预先构造好一个数据库,然后进行ODBC的数据源定义。1、设计数据库数据库表与表之间的关系构成了一个数据库。这里我们用Microsoft Access创建一个数据库Student.mdb,其中包含两个表xs和zy,如书330页所示。1)开机正常屏幕状态开始程序Microsoft OfficeMicrosoft Office Access 2003新建文件空数据库文件名处写:student点右边的创建新建设计视图确定出现表,你按书331页上面的表格敲入数据即可:字段名称 数据类型 (在下面改变)字段大小 说明 stuid 文本 6 学号 name 文本 8 姓名 sex 文本 2 性别 profcode 文本 6 专业代号2)关闭此表提问:你是否保存对表1的设计更改?是表名写xs是便在数据库中建立了表xs3)你双击xs出现设计视图表,之后你将330页的表即下面的数据敲进去学号 姓名 性别 专业代号990101 李林 男 102001990102 高山 男 102001990201 王平 男 109003990202 丁玲 女 1090034)接着你再点本界面上面的新建设计视图确定,重复2步)步骤再建表zy字段名称 数据类型 (在下面改变)字段大小 说明profcode 文本 6 专业代号profname 文本 12 专业名称stuyears 文本 整型 学制5)你双击zy出现设计视图表,之后你将331页的中间的表即下面的数据敲进去专业代号 专业名称 学制102001 计算机及应用 4102002 应用电子技术 2102003 自动控制 4102004 通信工程 4109003 计算机科学 42、定义ODBC的数据源 桌面左下角开始设置控制面板管理工具双击ODBC图标,进入ODBC数据源管理器按书上331页最下面的(1)开作:3、MFC AppWizard的创建创建一个SDI单文档应用程序,名为:数据库编程 -按书上332页下面的(2)开始作4、浏览记录打开“数据库编程”项目切换到项目工作区的资源栏点开Dialog双击IDD_My_FORM-按书334页(3)往下作 -5、改变与m_pSet关联的表在上面过程中,生成的CMyView类中,包含一个指向CMySet对象的指针m_pSet。该指针与用户的表(这里是xs)相关联,它是由MFC AppWizard建立的,目的是在表单视图和记录集之间建立联系,使得记录集中的查询结果很容易地在表单视图上显示出来。当然,m_pSet所关联的表也可通过ClassWizard来改变。其方法如书335页按书(1)-(5)步骤作。6、MFC的ODBC类 见书336页-338页说明:如:查询记录、添加记录、删除记录、修改记录等。7、数据库编程 从显示记录总数和当前记录号、编辑记录和处理多个表等几个方面讨论数据库编程的方法和技巧。1) 显示记录总数和当前记录号在“数据库编程”的记录浏览过程中,用户并不能知道表中的记录总数及当前的记录位置,这就造成了交互的不完善,因此必须将这些信息显示出来。这时就需要使用CRecordset类的成员函数GetRecordCount和GetStatus,它们分别用来获得表中的记录总数和当前记录的索引,其原型如下:long GetRecordCount()const;void GetStatus(CRecordsetStatus&rStatus)const; 其中:参数rStatus是指向下列的CRecordsetStatus结构的对象: 见书338页结构体说明。例:显示记录信息(总的记录数和当前记录数)(1)调入前面的“数据库编程”单文档应用程序(2)打开MainFrm.cpp文件,将原先的indicators数组修改如书338页: -按书338页(2)往后作。书(3)步:CString str;CMainFrame *pFrame = (CMainFrame *)AfxGetApp()-m_pMainWnd;CStatusBar *pStatus = &pFrame-m_wndStatusBar;if(pStatus)CRecordsetStatus rStatus;m_pSet-GetStatus(rStatus);str.Format(当前记录:%d/总记录:%d,1+rStatus.m_lCurrentRecord,m_pSet-GetRecordCount();pStatus-SetPaneText(1,str);书(4)步: 书(5)步:while(!m_pSet-IsEOF() #include MainFrm.hm_pSet-MoveNext();m_pSet-GetRecordCount();m_pSet-MoveFirst();书(6)步:将MainFrm.h文件中的保护型变量m_wndStatusBar变成公共变量。见下面的状态栏中,你若向前翻页,它就变化。有数据库总条数,和你翻的页数。2)查询记录使用CRecordSet类的成员变量m_strFilter、m_strSort和成员函数Open可以对表进行记录的查询和排序。示例如下:(1)在上面项目中,你打开资源栏,点开Dialog,双击IDD_MY_FORM,在学生表下面,加一静态控件写:要查询的学号,接着再加一个编辑控件,ID为:IDC_EDIT_QUERY,再加一个按钮控件,ID号为:IDC_BUTTON_QUERYCaption标题处写:查询(2)打开MFC ClassWizard对话框,为控件IDC_EDIT_QUERY添加关联变量m_strQuery。(3)在View类中添加按钮控件IDC_BUTTON_QUERY的BN_CLICKED消息映射,并加下列代码:void CMyView:OnButtonQuery() / TODO: Add your control notification handler code hereUpdateData(); m_strQuery.TrimLeft();if(m_strQuery.IsEmpty()MessageBox(要查询的姓名不能为空);return;if(m_pSet-IsOpen()m_pSet-Close();/如果记录集打开,则先关闭m_pSet-m_strFilter.Format(stuid=%s,m_strQuery);/stuid是xs表的字段名,用来指定查询条件m_pSet-m_strSort=name;/name是xs表的字段名,用来按name字段从小到大排序m_pSet-Open();if(!m_pSet-IsEOF()/如果打开记录集,有记录UpdateData(FALSE);/自动更新表中控件显示的内容else MessageBox(没有找到你要查找的名字!);/其中,m_strFilter和m_strSort是CRecordSet的成员变量,用来执行条件查询和排序。其中,m_strFilter称为过滤字符串,相当于SQL语句中WHERE后的条件串;而m_strSort称为排序字符串,相当于SQL语句中ORDER BY后的字符串。若字段的数据类型是文本,则需要在m_strFilter字符串中用单引号将查询的内容括起来;对于数字,则不需要用单引号。需要注意的是:只有在调用Open函数之前设置m_strFilter和m_strSort才能保证查询和排序有效。如果有多个条件查询,则可以使用AND、OR、NOT来组合,例如:m_pSet-m_strFilter=stuid=990103AND stdioAddNew(); /在表的末尾增加新记录UpdateData(TRUE); /将控件中的数据传给字段数据成员m_pSet-Update(); /将新记录存入数据库m_pSet-MoveLast(); /将当前记录位置定位到最后一个记录UpdateData(FALSE); /将字段数据成员的数据传给控件,即在控件中显示 在修改和添加记录数据之前,往往设计一个对话框用以获得所需要的数据,然后用该数据进行当前记录的编辑。这样就能避免它们的相互影响,且保证代码的相对独立性。例:在表单视图中增加3个按钮:添加记录、修改记录、删除记录,如:书340页图9.17所示。单击添加记录或修改记录都将弹出一个如书340页图9.18所示的对话框,在对话框中可以进行数据的添加或修改,单击对话框的确定按钮则数据有效。(1)将前面的单文档应用程序Ex_ODBC调入 -按书341-342页步骤作-书第(6)步: UpdateData(TRUE);书第(7)步:添加按钮的映射消息是:void CMyView:OnRecAdd() / TODO: Add your control notification handler code hereCStuDlg dlg;/以下语句书上没有dlg.m_StuID = m_pSet-m_stuid; /从这开始是另加的dlg.m_StuName = m_pSet-m_name;/使加上的学号、姓名、性别、专业代号dlg.m_StuSex = m_pSet-m_sex; /传送到各自的成员变量中dlg.m_ProfCode = m_pSet-m_profcode;/到这为止 if(dlg.DoModal()=IDOK)m_pSet-AddNew();m_pSet-m_stuid = dlg.m_StuID;m_pSet-m_name = dlg.m_StuName;m_pSet-m_sex = dlg.m_StuSex;m_pSet-m_profcode = dlg.m_ProfCode;m_pSet-Update();m_pSet-Requery();void CMyView:OnRecEdit() / TODO: Add your control notification handler code hereCStuDlg dlg;dlg.m_StuID = m_pSet-m_stuid;dlg.m_StuName = m_pSet-m_name;dlg.m_StuSex = m_pSet-m_sex;dlg.m_ProfCode = m_pSet-m_profcode;if(dlg.DoModal()=IDOK)m_pSet-Edit();m_pSet-m_stuid = dlg.m_StuID;m_pSet-m_name = dlg.m_StuName;m_pSet-m_sex = dlg.m_StuSex;m_pSet-m_profcode = dlg.m_ProfCode;m_pSet-Update();UpdateData(FALSE);void CMyView:OnRecDel() / TODO: Add your control notification handler code hereCRecordsetStatus status;m_pSet-GetStatus(status);m_pSet-Delete();if(status.m_lCurrentRecord=0)m_pSet-MoveNext();elsem_pSet-MoveFirst();UpdateData(FALSE);在CMyView.cpp最上面加:#include “StuDlg.h”4)处理多个表数据库中表与表之间往往存在着一定的关系,例如前面的学生表(xs)中的专业代码所代表的专业和学制需要通过专业代码表(zy)才能得知。因此,在数据库应用程序中一般都要处理多个表。例:用MFC处理多个表 按342-344页步骤作;注意:书第(2)(3)步:1、建一个基类为CRecordset的CCodeSet类2、还要以同样的方法再建一个基类为CRecordset的CCodexSet的类,用来处理专业名称和学制。注意加此类时,它问你数据源时,你按你的数据源名来写:xs书第(9)步:BOOL CStuDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereCCodeSet codeSet; codeSet.Open(); while (!codeSet.IsEOF() m_CodeList.AddString(codeSet.m_profcode); codeSet.MoveNext(); codeSet.Close(); if(!m_ProfCode.IsEmpty() int index=m_CodeList.FindString(-1,m_ProfCode); if(index!=LB_ERR) m_CodeList.SetCurSel(index); OnSelchangeList1(); return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE书第(10)步:为控件IDC_LIST1在StuDlg类中增加的LBN_SELCHANGE消息映射函数是:void CStuDlg:OnSelchangeList1() / TODO: Add your control notification handler code hereint index=m_CodeList.GetCurSel();if(index!=LB_ERR)CString str;m_CodeList.GetText(index,str);CCodeSet codeSet;codeSet.m_strFilter.Format(profcode=%s,str);if(codeSet.Open() m_Disp.Format(%s %d,codeSet.m_profname,codeSet.m_stuyears); /显示专业名称和学制 m_ProfCode=str;/专业代号/从这开始是书上没有,另加的语句,用CodexSet来处理专业名称和学制CCodexSet codexSet; codexSet.m_strFilter.Format(profcode=%s,str);/专业代号 if(codexSet.Open() m_StuID = codexSet.m_stuid; /将学号、姓名 m_StuName = codexSet.m_name;/和性别传送到弹出的对话框上的/其相对应的成员变量中, m_StuSex = codexSet.m_sex; /到这为止 UpdateData(FALSE);codeSet.Close();书第(11)步:在StuDlg.cpp文件中加:#include “CodeSet.h”#include “CodexSet.h”8、数据库相关的ActiveX控件在前面的数据库处理中,一次只能显示一行记录,且修改或添加操作不能可视化地进行。为了弥补MFC的这种不足,在Visual C+6.0中允许用户使用一些ActiveX控件更好地处理数据,它们是:MSFlexGrid,RemoteData,DBGrid等。1)使用MSFlexGrid控件Microsoft FlexGrid(MSFlexGrid)控件可以显示网格数据,也可以对其进行操作。它提供了高度灵活的网格排序、合并和格式设置功能,网格中可以包含字符串和图片。利用MSFlexGrid可以将某个表的所有记录显示。(1)将控件MSFlexGrid的类添加到项目中 书345-346页,加完之后,见控件表中多出了一个控件,那就是这个控件。(2)向对话框添加MSFlexGrid控件 向对话框添加MSFlexGrid控件与其它常用控件添加的方法一样。MSFlexGrid控件也有自己的属性,如:通用、样式、字体、颜色、图片等,如书346页图9.24所示。这些属性不仅能设置控件的字体、颜色,而且能设置网格的行数和列数以及其它的功能,它的可视化程度一般都比Visual C+的常用控件要高得多。例:书346页,注意:先将你刚加到控件表中的MSFlexGrid控件,拖到对话框(ID是 - _FORM)中,ID为:IDC_MSFLEXGRID1,并在View类加一个MSFlexGrid类的成员变量m_MSFGrid,然后,在视图类(View)中的OnInitialUpdate函数体中添加代码:书346页。m_MSFGrid.SetCols(m_pSet-m_nFields+1);/设置望格的最大列数 m_MSFGrid.SetRows(m_pSet-GetRecordCount()+1); m_MSFGrid.SetColWidth(-1,1440); m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(1); m_MSFGrid.SetText(学号); m_MSFGrid.SetRow(0);m_MSFGrid.SetCol(2); m_MSFGrid.SetText(姓名); m_MSFGrid.SetRow(0);m_MSFGrid.SetCol(3); m_MSFGrid.SetText(性别); m_MSFGrid.SetRow(0);m_MSFGrid.SetCol(4); m_MSFGrid.SetText(专业代号); int iRow=1; while(!m_pSet-IsEOF() CString str; str.Format(记录%d,iRow); m_MSFGrid.SetRow(iRow);m_MSFGrid.SetCol(0); m_MSFGrid.SetText(str); m_MSFGrid.SetRow(iRow);m_MSFGrid.SetCol(1); m_MSFGrid.SetText(m_pSet-m_stuid); m_MSFGrid.SetRow(iRow);m_MSFGrid.SetCol(2); m_MSFGrid.SetText(m_pSet-m_name); m_MSFGrid.SetRow(iRow);m_MSFGrid.SetCol(3); m_MSFGrid.SetText(m_pSet-m_sex); m_MSFGrid.SetRow(iRow);m_MSFGrid.SetCol(4); m_MSFGrid.SetText(m_pSet-m_profcode); iRow+; m_pSet-MoveNext(); m_MSFGrid.SetRow(1); m_MSFGrid.SetCol(1); m_pSet-MoveFirst();如上代码的目的,是将m_pSet所关联的表的记录内容显示在MSFlexGrid控件上,结果如书347页图9.25所示。2) RemoteData和DBGrid控件MSFlexGrid控件提供界面友好的网格,使表的记录内容能全部地显示出来,但却没有表处理的常用功能,如添加记录、修改记录和删除记录等。而DBGrid控件就有这方面的功能,它不仅能显示全部表的记录内容,而且能很好地支持常见的记录操作。 需注意的是DBGrid控件还必须用RemoteData控件来提供数据源,它最大的好处是不需要任何程序代码就能实现表的处理。(1)RemoteData控件 通过被绑定的控件存取存储在远程ODBC数据源中的数据。RemoteData控件允许在某一记录集的行与行之间移动,且允许显示和操作来自于被绑定的控件各行里的数据。RemoteData控件在远程数据对象(RDO)和数据识别的被绑定的控件之间提供了接口。通过RemoteData控件,能够:1) 建立起与基于其本身属性的数据源的连接2) 创建RDO的结果集3) 把当前的数据传给相应被绑定的控件4) 允许对当前行指针进行定位5) 将对被绑定的控件所做的任何更改反传给数据源l 向IDD_MY_FORM对话框添加RemoteData控件由于RemoteData控件一般不需要程序再控制,因此向一个对话框中添加RemoteData控件时,只需要在IDD_MY_FORM对话框中右击

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论