2 数据库系统开发相关知识介绍 2.1 MFC消息映射机制的具体实现过程 copyright paper51.com
在Windows中,不仅用户程序可以调用系统的API函数,返回来系统也会调用用户程序,这个调用是通过消息来进行[1]。由此可知Windows程序设计是一种完全不同于传统的DOS方式的程序设计方法。它是一种事件驱动方式的程序设计模式,主要是基于消息的。所以在使用Visual C++这种工具开发项目之前,我们要对其MFC的消息映射机制有所了解,下面将对其进行简单的介绍。 http://www.paper51.com MFC消息机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。在消息映射表中,消息与对应的消息处理函数指针是成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类对应的静态表中。当有消息需要处理时,程序只要检索该消息静态表,查看表中是否含有该消息,就可以知道该类能否处理此消息。如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。 内容来自论文无忧网 www.paper51.com
为了看清楚MFC消息映射机制的实际实现过程,先新建一个单文档类型的MFC AppWizard (exe)工程,取名为Draw。MFC在后台维护了一个窗口句柄与对应的C++对象指针的对照表。以CDrawView类为例,与CDrawViewd对象相关的有一个窗口,窗口当然有它的窗口句柄,该句柄与CDrawView对象的一个指针(即CDrawView*)存在着一一对应关系,在窗口与C++对象对照表中就维护了这种对应关系。当收到某一消息时,消息的第一个参数就指明该消息与哪个句柄相关,通过对照表,就可以找到与之相关的C++对象指针。然后把这个指针传递给应用程序框架窗口类的基类,后者会调用一个名为WindowProc的函数。该函数的定义位于WinCore.cpp文件。代码如下: http://www.paper51.com LRESULT CWind::WindowProc(UINT message,WPARAM wParam,LPARAM lParam) 内容来自www.paper51.com { paper51.com //OnWndMsg does most of the work ,except for DefWindowProc call paper51.com LRESULT lResult=0; http://www.paper51.com
if(!OnWndMsg(message,wParam,lParam,&lResult)lResult=DefWindowProc(message,wParam,lParam); copyright paper51.com return lResult; 内容来自论文无忧网 www.paper51.com } paper51.com 根据这个WindowProc函数的定义,我们发现它是一个虚函数。同时,也可以发现,CWind::WindowProc函数内部调用了一个OnWndMsg函数,真正的消息路由,也就是消息映射就是由此函数完成的。OnWndMsg函数的定义也位于WinCore.cpp文件中,部分代码如下: http://www.paper51.com BOOLCWnd::OnWndMsg(UINTmessage,WPARAMwParam,LPARAM lParam,LRESULT*pResult) http://www.paper51.com { 内容来自www.paper51.com LRESULT lResult=0; paper51.com //special cade for commands 内容来自论文无忧网 www.paper51.com if(message==WM_COMMAND) http://www.paper51.com
{ paper51.com if(OnCommand(wParam,lParam)) 内容来自论文无忧网 www.paper51.com { http://www.paper51.com
lResult=1; paper51.com goto LReturnTrue; paper51.com
} paper51.com return FALSE; 内容来自论文无忧网 www.paper51.com
} copyright paper51.com //special case for notifies http://www.paper51.com if(message==WM_NOTIFY) paper51.com { http://www.paper51.com NMHDR*pNMHDR=(NMHDR*)lParam; 内容来自论文无忧网 www.paper51.com If(pNMHDR->hwndFrom!=NULL&&OnNotify(wParam,lParam,&lResult)) http://www.paper51.com Goto LReturnTrue; copyright paper51.com
Ruturn FALSE; http://www.paper51.com } paper51.com
//special case for activation paper51.com if(message==WM_ACTIVATE) 内容来自论文无忧网 www.paper51.com _AfxHandleActivate(this,wParam,CWnd::FromHandle((HWND)lParam)); 内容来自论文无忧网 www.paper51.com //special case for set cursor HTERROR 内容来自www.paper51.com if(message==WM_SETCURSOR&&_AfxHandleSetCursor(this,(short)LOWORD(lParam),HIWORD(lParam))) 内容来自论文无忧网 www.paper51.com { 内容来自www.paper51.com lResult=1; paper51.com
goto LReturnTrue; 内容来自www.paper51.com } 内容来自www.paper51.com … … 内容来自www.paper51.com return TRUE; http://www.paper51.com } paper51.com OnWndMsg函数的处理过程是: copyright paper51.com 首先判断是否有消息响应函数。判断方法是在相应窗口类中查找所需的消息响应函数。因为传递给WindowProc函数的是窗口子类指针,所以,OnWndMsg函数会到相应的子类头文件中查找,看看DECLARE_MAP( )宏之上,两个AFX_MSG注释之间是否有相应的消息响应函数原型的声明;再到子类的源文件中,看看BEGIN_MESSAGE_MAP和END_MESSAGE_MAP( )这两个宏之间是否有相应的消息映射宏。 paper51.com 如果通过上述步骤,找到了消息响应函数,那么接着就会调用该响应函数,对消息进行处理。如果在子类中没有找到消息响应函数,那么就交由基类进行处理。通过以上步骤,MFC就实现了具体的消息映射,从而完成对消息的响应。 内容来自论文无忧网 www.paper51.com 2.2 关系型数据库的基本概念 http://www.paper51.com 数据库这一概念提出后,先后出现了几种数据模型。其中基本的数据模型有三种:层次模型系统、网络模型系统、和关系模型系统。六十年代末期提出的关系模型具有数据结构简单灵活、易学易懂且具有雄厚的数学基础等特点,从七十年代开始流行,发展到现在已成为数据库的标准。目前广泛使用的数据库软件都是基于关系模型的关系数据库管理系统。 内容来自www.paper51.com 2.2.1 关系模型(RM即Relational Model) paper51.com 关系模型把世界看作是由实体(Entity)和联系(Relationship)构成的[13]。 http://www.paper51.com 所谓实体就是指现实世界中具有区分与其它事物的特征或属性并与其它实体有联系的对象。在关系模型中实体通常是以表的形式来表现的。表的每一行描述实体的一个实例,表的每一列描述实体的一个特征或属性。 paper51.com 所谓联系就是指实体之间的关系,即实体之间的对应关系。联系可以分为三种: http://www.paper51.com A. 一对一的联系。如:一个人只有一种性别,一个人→性别为一对一的联系; 内容来自www.paper51.com B. 一对多的联系。如:相同性别的人有许多个,性别→人为一对多的联系; http://www.paper51.com C. 多对一的联系。如:很多人有同一个性别,人→性别为多对一的联系。 内容来自论文无忧网 www.paper51.com 通过联系就可以用一个实体的信息来查找另一个实体的信息。 内容来自www.paper51.com 关系模型把所有的数据都组织到表中。表是由行和列组成的,行表示数据的记录,列表示记录中的域。表反映了现实世界中的事实和值。 copyright paper51.com 2.2.2 关系数据库(RDB即Relational Database) paper51.com
所谓关系数据库就是基于关系模型的数据库,下面是与其有关的几个重要的概念: paper51.com A. 关系数据库管理系统(RDBMS) 内容来自论文无忧网 www.paper51.com B. 关系数据库管理系统就是管理关系数据库的计算机软件 copyright paper51.com
C. 关键字(Key) copyright paper51.com 关键字是关系模型中的一个重要概念,它是逻辑结构,不是数据库的物理部分。 copyright paper51.com
a. 侯选关键字(Candidate Key) copyright paper51.com
如果一个属性集能惟一地标识表的一行而又不含多余的属性,那么这个属性集称为侯选关键字。 http://www.paper51.com b. 主关键字(Primary Key) paper51.com
主关键字是被挑选出来,作表的行的惟一标识的侯选关键字。一个表只有一个主关键字。主关键字又可以称为主键。 内容来自论文无忧网 www.paper51.com c. 公共关键字(Common Key) http://www.paper51.com 在关系数据库中,关系之间的联系是通过相容或相同的属性或属性组来表示的。如果两个关系中具有相容或相同的属性或属性组,那么这个属性或属性组被称为这两个关系的公共关键字。 copyright paper51.com d. 外关键字(Foreign Key) http://www.paper51.com 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外关键字。由此可见,外关键字表示了两个关系之间的联系。以另一个关系的外关键字作主关键字的表被称为主表,具有此外关键字的表被称为主表的从表。外关键字又称作外键[12]。 内容来自www.paper51.com |