毕业设计(论文)-铁路客运安全服务系统--基于vc++的上位机控制系统_第1页
毕业设计(论文)-铁路客运安全服务系统--基于vc++的上位机控制系统_第2页
毕业设计(论文)-铁路客运安全服务系统--基于vc++的上位机控制系统_第3页
毕业设计(论文)-铁路客运安全服务系统--基于vc++的上位机控制系统_第4页
毕业设计(论文)-铁路客运安全服务系统--基于vc++的上位机控制系统_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

铁路客运安全服务系统基于VC的上位机控制系统摘要本文介绍了本人应用VC60和ACCESS2000工具开发铁路客运安全服务系统的过程,对开发软件进行了简单介绍,遵从软件开发的一般步骤,涉及到软件开发前期的系统的需求分析,详细设计过程中数据库的设计,包括表的设计等,着重讲述了我在开发过程中所承担的工作,包括上位机整体的构思、设计及实现,串口控件、类的使用,以及在VC中主框架、弹出项和数据库的设计,程序模块的编程思想、代码实现等,并总结了在开发过程中所遇到的问题及其解决方法。关键词串口通讯ACCESS数据库ODBCCSERIALPORTEXABSTRACT目录第一章系统的整体研究11本次毕业设计的意义12设计内容概述第二章技术的考虑和选择21开发的软件环境211VISUALC60212ACCESS200022开发的硬件环境221RS232异步串行通讯总线222RS485接口转换器ADS10623通讯方案的确定231目前流行的开发技术的比较232MSCOMM控件的研究233CSERIALPORTEX类的分析234为什么要选择CSERIALPORTEX类技术第三章系统分析与设计31问题的提出32可行性研究33需求分析34系统各模块间的关系图第四章数据库的设计与实现41开放式数据库连接ODBC技术411开放式数据库连接简介412MFC对ODBC的支持413在MFC中应用ODBC编程42数据库中表的设计43创建并配置数据源第五章程序设计与实现51程序创建与数据库连接52主窗体的设计53数据库显示模块54串口通讯模块541通讯协议的确定542数据的接收与入库543串口设置544点名功能的实现55信息查询模块551普通查询552问题查询第六章遇到的问题及解决结论谢辞参考文献技术文章翻译附录前言在通讯技术飞速发展的今天,随着铁路部门的列车提速,车站人员流动量的增大,铁路客运的安全已经越来越受到人们的关注和重视。针对这一问题,我们设计开发了基于VC环境下的铁路客运安全服务系统。目前,在这方面航空部门已经将互联网技术应用到比较高的水平,实现了在各大机场间的互动联系通讯,在乘客登机前进行刷卡登机,将基本资料进行记录,然后通过乘客登机前的登机记录,实现对每一次航班的所有登机乘客的基本资料的统计,并在各大机场间进行相应的通讯联系,存储每位乘客登机和离机的时间、地点,从而为出事后的调查工作提供可靠的依据、线索。由于铁路部门是一个每日客流量都很大的大型运输部门,在这方面的管理工作尚不完善,这种比较先进的系统在铁路方面尚未得到广泛的应用,所以这次我们所做的“铁路客运安全服务系统”就是本着在铁路客运站点上实现这种机制的原则,来进行开发设计的,用以解决铁路站点出入人员流动量大、人员情况复杂、难于管理的问题,完善了铁路安全保障系统,保证铁路旅客乘车的安全。所以,要在铁路实现这样一个安全机制,不仅有很强的实用价值,而且有广阔的应用前景,其意义也是非常之深远的。本系统预定由一台上位机和若干台下位机组成,各下位机用来模仿全国铁路的各个站点,上位机运用点名式方法接收、管理、存储各下位机所记录的信息,将之汇总存入后台数据库,并可以针对库中的记录进行各种查询操作。我们小组由6人组成,其中5人各负责一台下位机的实现,我则在课题中主要负责上位机的开发任务,并参与了系统最后的调试工作。对于上位机的开发,主要包括三个方面的内容串口通讯,前台界面和后台数据库。现在,铁路客运安全服务系统作为较新的管理方法,已经逐渐被社会大众所认同,并开始应用于相关的领域中,它有着很大的发展前景。首先,从社会角度讲,实现这样一个安全机制对整个社会的安全稳定是有很大帮助的,一旦列车出现故障、事故,铁路部门可以及时通过该机制辅助对事故发生的原因进行调查,以尽快找出原因,做好防范措施。其次,从经济角度讲,建立这样一套安全机制对铁路企业自身的长远发展也会有不小的益处。它能够使铁路部门在事故发生后的调查工作中,节省人、财、物力,从而节省开支。当然我们也应看到,现在的铁路客运安全服务系统仍面临着几个重大课题首先,安全性问题。现在的安全系统的安全性并不是很完善。一些高级黑客可以很轻松地进入系统,破坏系统数据。对于这类问题,目前的系统很少有完善的安全性保证。其次,我们所做的系统只是应用于局域网,通过计算机的串口进行通讯传输的,未来是网络的时代,将来的发展趋势是在任何可以连接到INTERNET的地方,都可以运行该系统,如何将安全系统搬到INTERNET上,这也将是一个重要问题。总之,铁路客运安全服务系统在将来将会越来越快地发展和普及,其前景将会是一片光明。通过本次毕业设计,在导师王老师的耐心指导和同学们的热心帮助下,使我对VC及数据库技术有了更加深入的理解和认识,同时也为团队合作开发规模稍大项目和综合应用本专业所学课程知识创造了实践机会,使我们通过参加小组团队的开发实践,理解真正的开发团队的工作程序,为今后走向社会打下坚实的基础。下面,让我们来具体介绍和分析这种服务系统。第一章系统的整体研究11本次毕业设计的研究意义随着时代的飞速发展,社会的不断进步,先进的科学技术不断应用于各大行业中。在铁路部门,现行的乘客安全管理制度已逐渐不能适应当前的时代变化,需要更新和完善。对于这方面的应用,航空部门已经做到了比较高的水平,实现了乘客登机前刷卡,将每一班飞机上乘客的基本资料进行存储,记录每位乘客登机和离机的时间、地点等资料,并通过互联网进行记录的传输,从而为出事后的调查工作提供可靠的依据、线索。铁路,是当今全国重要的交通工具之一。它自出现以来就一直占据交通领域的重要地位,是全国经济运行的命脉;虽然现在航空、海运、河运、公路等其他交通工具蓬勃发展起来,但铁路的重要地位依然没有被动摇。像这样一个重要的部门,它的健康成长是极其重要的。所以,针对铁路现行的安全管理制度的改进是事在必行的。由于铁路部门是一个每日客流量都很大的大型运输部门,在这方面的管理工作尚不完善,类似航空部门那种比较先进的系统在铁路方面尚未得到广泛的应用,所以这次我们所做的“铁路客运安全服务系统”就是本着在铁路客运站点上实现这种机制的原则,来进行开发设计的,用以解决铁路站点出入人员流动量大、人员情况复杂、难于管理等问题,从而完善铁路安全保障系统,保证铁路旅客乘车的安全。要在铁路实现这样一个安全机制,不仅有很强的实用价值,而且有广阔的应用前景,其意义也是非常之深远的。12设计内容概述在本次设计中,我主要负责整个系统上位机的整体设计工作,主要是3个方面内容串口通讯,主界面设计和后台数据库建立。系统的功能模块主要包括串口通信模块、数据库处理模块、控制模块、显示模块和查询模块共5个。其中串口通信模块包含串口数据的接收入库与显示、串口设置、循环点名、单一点名;查询模块包括普通查询、问题查询。第二章技术的考虑和选择21开发的软件环境在本次设计中我们使用了WINDOWSME的操作系统,应用VISUALC60和ACCESS2000,下面将对这两种软件进行简单的介绍,并对本人在开发过程中所用到的功能进行简单分析。211VISUALC60VISUALC60是一种高级编程工具软件,它有功能强大的集成开发环境,并提供功能强大的向导工具(MFCAPPWIZARD、CLASSWIZARD、MFCACTIVEXCONTROLWIZARD等)来简化WIN32应用程序的开发,用它可以方便地进行项目的管理、编写C源程序、编译、改错。更重要的是,VISUALC提供了一套MICROSOFTFOUNDATIONCLASSES简称为MFC的程序类库(CLASSESLIBRARY),现在这套由微软开发的程序类库已经成为设计窗口应用程序的准工业标准。其向导用于帮助生成各种不同类型应用程序的基本框架,并可以使用CLASSWIZARD来创建新类CLASS,定义消息处理函数(MESSAGEHANDLER),覆盖虚拟函数(VIRTUALFUNCTION)、从对话框(DIALOGBOX)、表单视图(FORMVIEW)、或者记录视图(RECORDVIEW)的控件中获取数据并验证数据的合法性,添加属性(PROPERTY)、事件(EVENT)和方法(METHOD)到自动化对象(AUTOMATIONOBJECT)中。此外还可以使用WIZARDBAR来定义消息处理函数、覆盖虚拟函数并浏览实现文件(CPP)。此外,VISUALC60提供最快的集成数据库访问,向导工具支持DAO和ODBC类,允许用户建立强有力的数据库应用程序。可以使用ODBC类和高性能的32位ODBC驱动程序来访问各种数据库管理系统;可以使用DAO(数据访问对象)类通过编程语言来访问和操纵数据库中的数据并管理数据库、数据库对象与结构。212ACCESS2000ACCESS是OFFICE办公系列软件中自带的一个数据库管理软件,它提供了一个功能强大、使用方便灵活的信息管理环境,是一个受到一致推崇的桌面数据库系统。它在用户和数据库之间架起了一座桥梁,使得用户对数据的存取、分类和查看更为容易。我用ACCESS2000建立的数据库,建立了表、并定义了主键。使用ODBC动态连接ACCESS数据库,并运用VC代码来实现对库内记录的查询功能。22开发的硬件环境在本次设计中,我们的项目涉及到串口通讯的问题,软件方面应用VC来实现,而硬件方面则应用到RS485接口转换器ADS106来实现通讯目标。221RS232C异步串行通讯总线RS232C是使用得最早、最多的一种异步串行通信总线。它由美国电子工业协会于1962年公布,它主要用来定义计算机系统的一些数据终端设备(DTE)和数据通信设备(DCE)之间接口的电气特性。RS232C标准总线有25条信号线,对其机械特性并未做严格规定。在RS232C中包括两个信道主信道和次信道,它的信号分为两类一类是DTE与DCE交换的信息TXD和RXD;另一类是为了正确无误地传输上述信息而设计的联络信号。222RS485接口转换器ADS106RS485接口转换器ADS106可将RS232C串行口的数据发送TD和数据接收(RD)信号转换成两线平衡的半双工RS485信号,它是远距离控制设备或点到多点总线通信的最佳选择,该接口转换装置,不需要外接交流直流电源,可直接从RS485端口内的数据发送(TD)信号、请求发送(RTS)或数据终端准备好(DTR)获取电源,而且还加上了发送数据自动控制的功能,在发送接收数据时不需要RTS使能控制。如下图所示这是一般应用RS485接口转换器的示意图,转换器RS232口端接上位机中心主站,RS485口端串行连接各RS485设备。但在本设计中,接口转换器RS232口端接上位机中心主站,而RS485口端则与其他接口转换器的RS485口端相连,形成一个星型连接。23通讯方案的确定在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。目前,用VC来实现串口的通讯方法有很多种,下面逐个进行简单的介绍,重点分析MSCOMM控件和CSERIALPORTEX类,最后说明选择CSERIALPORTEX类的原因。231目前流行的几种开发技术的比较在MICROSOFTWINDOWS下开发串口通信程序通常有如下几种方法1利用WINDOWSAPI通信函数。2利用WINDOWS的读写端口函数_INP、_INPW、_INPD、_OUTP、_OUTPW、_OUTPWWINDOWS95系列下或开发驱动程序WINDOWSNT系列下直接对串口进行操作。3利用第三方提供或自己编写的通信类。4使用串口通信组件,如ACTIVEX控件MSCOMM。在以上几种方法中第一种即API函数法使用面较广,但由于比较复杂,使用比较困难。第二种需要了解硬件电路结构原理,深入驱动层次,专业化程度较高。第三种方法使用面向对象技术封装WIN32API函数,提供一个用于串行通信的类,只要理解这种类的几个成员函数,就能方便地使用。第四种方法较简单,只需要对串口进行简单的配置,唯一比较困难的地方在于令人费解的VARIANT类。232MSCOMM控件的研究MICROSOFTCOMMUNICATIONCONTROL简称MSCOMM是微软公司提供的简化WINDOWS下串行通信编程的ACTIVEX控件,它为应用程序提供了通过串行接口收发数据的简便方法,在VISUALC、VISUALBASIC、DELPHI等语言中均可以使用。MSCOMM控件提供两种处理通信的方式事件驱动方式和查询方式。1事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CARRIERDETECTCD或REQUESTTOSENDRTS线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSCOMM控件的ONCOMM事件捕获并处理这些通讯事件。ONCOMM事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅COMMEVENT属性。在编程过程中,就可以在ONCOMM事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSCOMM控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSCOMM控件2查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查COMMEVENT属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。MSCOMM控件有很多重要的属性,但首先必须熟悉几个属性1COMMPORT设置并返回通讯端口号。2SETTINGS以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。3PORTOPEN设置并返回通讯端口的状态。也可以打开和关闭端口。4INPUT从接收缓冲区返回和删除字符。5OUTPUT向传输缓冲区写一个字符串。下面分别描述COMMPORT属性设置并返回通讯端口号,类型为SHORT。语法OBJECTCOMMPORTVALUEVALUE一整型值,说明端口号。说明在设计时,VALUE可以设置成从1到16的任何数(缺省值为1)。但是如果用PORTOPEN属性打开一个并不存在的端口时,MSCOMM控件会产生错误68(设备无效)。注意必须在打开端口之前设置COMMPORT属性。SETTINGS属性设置并返回数据波特率、奇偶校验、数据位、停止位参数,类型为CSTRING。语法OBJECTSETTINGSVALUE说明当端口打开时,如果VALUE非法,则MSCOMM控件产生错误380(非法属性值)。VALUE由四个设置值组成,有如下的格式“BBBB,P,D,S“BBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。VALUE的缺省值是“9600,N,8,1“PORTOPEN属性设置或返回串口状态,BOOL类型值为TURE时打开,值为FALSE时关闭。INPUT属性从接收缓冲区读取数据,类型为VARIANT。OUTPUT属性向发送缓冲区写入数据,类型为VARIANT。233CSERIALPORTEX类的分析串口通信类CSERIALPORTEX是在REMONSPEKREIJSE设计的CSERIALPORT类基础上设计的,并增加了对二进制数据传输和块读写方式的支持和其他功能函数。CSERIALPORTEX类主要使用异步方式操作串口,但为了能适用于不同的需求,也提供了使用其他方式操作串口的公共成员函数。CSERIALPORTEX类的设计目标是提供封装串口通信细节、健壮高效的串口通信类,能支持多串口、多线程,并能在所有主流WINDOWS系统下使用。CSERIALPORTEX类的用户只需熟悉少数几个公共成员函数,就能轻易在自己的程序中加入串口支持。但值得注意的是,CSERIALPORTEX类并不支持串口通信协议,因为不同应用场合下可能需要使用不同的协议,而使用串口所需的基本功能在各种应用场合都是将近相同。下面简单分析CSERIALPORTEX类的基本功能1建立EVENT本步骤在串口初始化函数CSERIALPORTEXINITPORT内实现,用异步方式操作串口必须要定义OVERLAPPER结构M_OV,其中的HEVENT成员必须自己创建,它通常必须负责EV_RXCHAR有字符到达串口和EV_BREAK、EV_CTS、EV_DSR、EV_ERR、EV_RING、EV_RLSD、EV_RXFLAG、EV_TXEMPTY等串口通信状态事件;此外CSERIALPORTEX建立了M_HSHUTDOWNEVENT关闭串口,最高优先级和M_HWRITEEVENT写串口事件。关键代码如下所示IFM_OVHEVENTNULLRESETEVENTM_OVHEVENTM_OVHEVENTCREATEEVENTNULL,TRUE,FALSE,NULLIFM_HWRITEEVENTNULLRESETEVENTM_HWRITEEVENTM_HWRITEEVENTCREATEEVENTNULL,TRUE,FALSE,NULLIFM_HSHUTDOWNEVENTNULLRESETEVENTM_HSHUTDOWNEVENTM_HSHUTDOWNEVENTCREATEEVENTNULL,TRUE,FALSE,NULL/INITIALIZETHEEVENTOBJECTSM_HEVENTARRAY0M_HSHUTDOWNEVENT/HIGHESTPRIORITYM_HEVENTARRAY1M_OVHEVENTM_HEVENTARRAY2M_HWRITEEVENT2打开串口本步骤在串口初始化函数CSERIALPORTEXINITPORT函数内实现。应用异步方式必须指定FILE_FLAG_OVERLAPPED,而文件方式必须OPEN_EXISTING,同时读写必须是GENERIC_READ|GENERIC_WRITE。关键代码如下M_HCOMMCREATEFILESZPORT,/串口名称字符串,如COM1GENERIC_READ|GENERIC_WRITE,/读写0,/以独占方式打开NULL,/未设置安全属性OPEN_EXISTING,/串口设备必须设置此值FILE_FLAG_OVERLAPPED,/使用异步I/O0/串口设备该参数必须设为03设置串口参数本步骤仍在CSERIALPORTEXINITPORT函数内实现。主要对串口的DCB结构、超时时间和串口状态事件进行配置。4创建串口主线程本步骤中线程创建在CSERIALPORTEXSTARTMONITORING内实现,线程实现函数为CSERIALPORTEXCOMMTHREAD。串口主线程监视写M_HWRITEEVENT、关闭M_HSHUTDOWNEVENT和串口通信状态事件M_OVHEVENT,包括数据到达串口事件,并调用相应函数处理这些事件。在串口主线程内将使用WAITCOMMEVENT检测线路状态,使用WAITFORMULTIPLEOBJECTS监视上述3类事件。5读写数据CSERIALPORTEX提供了两种读数据的方式,隐式调用的RECEIVECHAR默认方式和显式调用的READBLOCK。RECEIVECHAR不需用户调用,串口主线程在有数据到达串口时自动调用该函数,它将读取到的数据通过自定义消息WM_COMM_RXCHAR发送给窗口M_POWNER,调用者只需在该窗口内处理WM_COMM_RXCHAR消息即可。READBLOCK由用户显式调用,调用形式如下BYTECSERIALPORTEXREADBLOCKCSERIALPORTEXPORT,INTVOIDCSERIALPORTEXWRITETOPORTCSTRINGSTR6关闭串口本步骤在CSERIALPORTEXSTOPMONITORING中实现。234为什么要选择CSERIALPORTEX类技术在本次毕业设计中,我最终选择了CSERIALPORTEX类来进行串口通信的设计工作,放弃了在开始时决定使用的MSCOMM控件。其原因主要是从以下几个方面来考虑的首先,从功能方面考虑,MSCOMM控件对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂处理的时候,MSCOMM通讯控件就不是那么好用了。它毕竟是一个VC中自带的控件,在功能方面还是有限的,不如CSERIALPORTEX类的功能强大。其次,从程序健壮性方面考虑,我们设计中的通信传输属性默认设置是“9600,8,1,N”,若应用MSCOMM控件的话,如果需要对这一数据进行变动,只能到源程序中手动修改SETTINGS的参数值,而CSERIALPORTEX类则提供了BOOLCSERIALPORTEXINITPORT函数支持动态设定串口参数,可以随时在生成的系统上进行更改,这就大大的扩展了所开发程序的应用范围。再次,我设计的上位机是基于VC中的单文档应用程序,而MSCOMM控件在基于对话框的程序中十分好用,但要让它基于单文档就不是那么简单了,按常规在对话框中的方法添加根本行不通,如要应用还需做相应的更改工作,且与最终实现的某些功能有冲突。最后,在今后这方面的实际应用中,随着程序开发的具体要求不同,对通信要求的功能也就不同。从长远来看,使用CSERIALPORTEX类比用MSCOMM控件更有发展前途。第三章系统分析与设计31问题的提出在科技飞速发展的今天,铁路部门现有的乘车管理机制已不能完全适应时代的发展,存在着出入人员流动量大、人员情况复杂、难于管理等问题,所以急需开发一个新的系统,实现有效的管理。32可行性研究可行性研究是指在当前组织内外的具体条件下,系统开发工作必须具备资源和条件,看是否满足系统目标的要求。在系统开发过程中进行可行性研究,对于保证资源的合理使用,避免浪费和一些不必要的失败,都是十分重要的。1目标方案的可行性目标和方案的可行性是指目标是否明确,方案是否切实可行,是否满足组织进一步发展的要求。2技术方面的可行性技术方面的可行性就是根据现有的技术条件,考虑所提出的要求是否能达到。关系到下面几个方面人员和技术力量的可行性基础管理的可行性组织系统开发方案的可行性计算机硬件的可行性计算机软件的可行性环境条件以及运行方面的可行性3经济方面的可行性经济方面的可行性主要是从组织的人力、财力、物力三方面来考察系统开发的可行性。我们经过了解和分析,确定本次设计的目标十分明确,方案切实可行,且能够较好的适应铁路现行的情况;目前我们掌握的技术VC60高级编程语言和ACCESS数据库已经能够实现所提出的要求,计算机系统的软、硬件开发环境也是允许的;从经济方面看,我们6人小组足以胜任这项开发工作,在财力、物力方面也没有什么问题。因此我们开发的这个“铁路客运安全服务系统”项目是可行的。33需求分析本次设计的具体计划为模拟当前铁路部门的几个站点,在每个站点建立一个出入站旅客信息登记制度,将每个站的出入旅客基本资料进行存储入库,另建立一台上位机对这些下位机的记录进行汇集存储,并通过串口相互连接的方式来实现通信传输。针对上位机,要求应用点名式的方法,正确接收各台下位机所发送的数据,正确记录后存入后台数据库,能够对库中的记录进行不同条件的查询,并能够查找出提前或置后下车的旅客信息。对于整个系统,我主要负责其中上位机的整体设计及实现工作。对于上位机的设计,主要是3个方面内容串口通讯,主界面设计和后台数据库建立。系统的功能模块主要包括串口通信模块、数据库处理模块、控制模块、显示模块和查询模块共5个。其中串口通信模块包含串口数据的接收入库、串口设置、循环点名、单一点名;信息查询模块包括普通查询、问题查询。串口数据的接收入库与显示主要是将从串口缓冲区读取的数据正确的存入数据库中相应的位置并将当前信息显示在主界面上;串口设置是可以根据提供的相关选项来进行对串口的波特率、数据位、停止位、校验位的设定;循环点名和单一点名则是根据具体的要求对各下位机轮流或单一发送消息,与之建立通讯连接;查询功能可以分为两种方法普通查询能依据旅客号查找出想了解的旅客的基本信息,而问题查询则可通过该旅客的上下车地点来判定他是否是按目的地正常下车的。34系统各模块间的关系图我们设计的安全系统在串口通信方面采用前面提到过的CSERIALPORTEX类来进行实现,接收串口数据时使用隐式调用,CSERIALPORTEX在串口数据到达时将数据发送到程序主窗口。控制模块每隔一段时间察看一次主窗口串口数据接收缓冲区,并对符合要求的数据进行处理后通过数据库处理模块存储到数据库中,同时请求显示模块更新记录。在需求分析的基础上,考虑VISUALC程序编制特点,得到如下所示的系统各模块间关系图(其中宽箭头表示数据流向)第四章数据库的设计与实现41开放式数据库连接ODBC技术开放式数据库连接ODBC为各种类型的数据库管理系统提供了统一的使用SQL语言的程序设计接口,本次设计的系统就是使用ODBC接口将数据保存到数据库中的。411开放式数据库连接简介ODBCOPENDATABASECONNECTIVITY,即开放式数据库连接,是基于SQL结构化查询语言而设计的,它提供了一组对数据库访问的标准API应用程序编程接口。一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,所有数据库的操作由对应的DBMS的ODBC驱动程序完成。在默认情况下,VC60只会安装SQLSERVER、ACCESS、FOXPRO和DBASE的驱动程序。由于ODBC通过使用驱动程序来提供数据库的独立性,因此,对于不同的数据库就要求使用不同的数据库驱动程序,驱动程序实际上是一个支持ODBC函数调用的模块,通常就是一个动态链接库DLL,应用程序就是通过调用动态链接库上的驱动程序所支持的函数来操作数据库的,它让应用程序的编写者避免了与数据源相连的复杂性。412MFC对ODBC的支持MFC的ODBC数据库类对较复杂的ODBCAPI进行了封装,提供了简化的调用接口,从而大大的方便了数据库应用程序的开发。MFC的数据库类包括CDATABASE类、CRECORDSET类、CRECORDVIEW类和CFIELDEXCHANGE类。CDATABASE类针对某个数据库,负责连接数据源;CRECORDSET类针对数据源中的记录集,负责对记录的操作;CRECORDVIEW类负责记录集的用户界面;而CFIELDEXCHANGE类负责CRECORDSET与数据源的数据交换。1CDATABASE类CDATABASE类主要功能是建立与ODBC数据源的连接,连接的句柄存放在其数据成员M_HDBC中,并提供一个获取连接字符串的成员函数GETCONNECT。可以创建一个CDATABASE类的对象,然后调用OPENEX成员函数来建立与数据源的连接通过ODBC驱动程序,函数原型为VIRTUALBOOLOPENEXLPCTSTR,DWORDDWOPTIONS0其中,参数LPSZCONNECTSTRING用于指定一个ODBC连接字符串,该字符串包含数据源名称和其他选项信息。若该值为NULL,则将弹出一个数据源对话框提示用户选择数据源,参数DWOPTIONS用于指定打开的数据库是否为独占方式和只读方式等选项。2CRECORDSET类CRECORDSET类代表从数据源选择的一组记录记录集,程序可以选择数据源中的某个表作为一个记录集,也可以通过对表的查询得到记录集,还可以合并同一数据源中多个表的列到一个记录集中。通过该类可以构造一个记录集,可以打开一个记录集,可以对记录集中的记录进行滚动、修改、增加和删除等操作。CRECORDSET类与数据源记录的交换是利用记录字段交换RFX机制。从数据库中导出的记录集有两种类型快照SNAPSHOT和动态集DYNASET。快照是一次性地从数据库中下载整个记录集内容,由固定成员组成一个静态集合。动态集是创建指向所请求的每个记录的实际指针,当连接的数据库是共享方式时,动态集的记录内容将动态显示你和其他应用程序所做的修改,因此其记录集内容不是一次性给定的,而是动态变化的。默认的记录集类型是快照。CRECORDSET类主要的成员函数1记录浏览操作函数包括MOVE、MOVEFIRST、MOVELAST、MOVENEXT、MOVEPREV和SETABSOLUTEPOSITION六个函数。MOVE函数将光标从当前位置往前或往后相对移动若干个记录,移动的记录数由参数指定,正值往前移尾部方向,负值往后移头部方向。SETABSOLUTEPOSITION函数将当前记录移到由参数指定的记录号上。其他四个函数分别将光标移到记录集中的第一个记录、最后一个记录、下一个记录和前一个记录。2记录更新操作函数包括ADDNEW、DELETE、EDIT、UPDATE、CANCELUPATE和REQUERY六个成员函数。ADDNEW函数用于添加新记录,DELETE函数用于删除当前记录,EDIT函数用于修改当前记录各字段数据的值。UPDATE函数用于完成前三个函数所做的修改在数据源上的最后保存,CANCELUPDATE函数取消任何由EDIT和ADDNEW操作导致的待处理的更新。REQUERY函数用于重新执行对记录集的查询,更新所选记录。通过给成员数据M_STRFILTER和M_STRSORT赋新值,然后调用REQUERY函数,可实现对记录的筛选和排序。3构造函数构造函数CRECORDSET用于创建一个记录集对象,并把一个CDATABASE对象的指针作为参数传递给CRECORDSET函数,以便获得已由CDATABASE对象建立起来的与数据源的连接。如果传给它一个NULL值,则CDATABASE对象被自动创建,并自动连接到数据源。CRECORDSET或其派生类对象通过一个虚函数GETDEFAULTCONNECT获得默认的连接字符串。必须在CRECORDSET派生类中定义该构造函数的内容。4记录字段数据交换函数包括DOFIELDEXCHANGE和DOBULKFIELDEXCHANGE两个函数,前者用于一般情况少量记录行的字段数据交换,后者用于大量记录行时的字段数据交换。记录字段数据交换是指在记录集上字段数据成员与数据源上当前记录对应列之间自动交换数据。5其他重要的成员函数GETDEFAULTSQL函数用于获得默认的SQL语句。CANUPDATE函数用于确认记录集是否可以更新。GETRECORDCOUNT函数用于获取记录集中的记录个数。ISDELETED函数用于确认当前记录是否被打上删除标记。ISBOF和ISEOF函数分别用于确认记录指针是否位于第一个记录之前或最后一个记录之后。GETFIELDVALUE函数用于获取当前记录中指定字段的值。3CRECORDVIEW类CRECORDVIEW类称之为记录视图,是在控件中显示数据库记录的视图。该视图是直接与一个记录集对象相连接的对话视图,从一个对话模板资源创建,在对话模板控件中显示记录集对象的字段数据。记录视图对象利用对话数据交换DDX机制和记录字段交换RFX机制自动实现窗体的控件与记录集的字段之间的数据移动。CRECORDSET也提供了移动记录移动到第一个、下一个、前一个和最后一个的默认实现,以及在视图中根据当前记录更新用户界面的默认实现。用APPWIZARD生成数据库应用程序框架时,APPWIZARD自动生成一个“记录”菜单,下面带有上述的移动记录的四个菜单项,并在工具栏上生成相应的四个工具按钮。CRECORDSETVIEW跟踪用户在记录集中的定位情况,以便记录视图能更新用户界面。CRECORDVIEW类是从CFORMVIEW类派生而来的,CFORMVIEW与一般CVIEW派生类的区别是在应用程序中会有一个对话框资源与该视图对应,在程序运行时,该对话框显示在当前视图中。CRECORDVIEW类从基类继承的成员函数中最重要的是对话数据交换函数DODATAEXCHANGE和数据更新函数UPDATEDATA,前者用于实现记录集的字段与对话框的控件之间进行数据交换,后者用于更新对话框中控件的数据。CRECORDVIEW类的特有成员函数为1ONGETRECORDSET函数调用ONGETRECORDSET函数以获得指向CRECORDSET派生类对象的指针。CLASSWIZARD已为你重载了该函数,如果必要的话,CLASSWIZARD将创建记录对象。2ONMOVE函数如果当前记录已改变,ONMOVE函数更新对当前记录所做的修改,移动当前记录到指定的记录上下一个、前一个、第一个或最后一个,显示新记录的字段内容。3ISONFIRSTRECORD和ISONLASTRECORD函数这两个函数分别用于确定当前记录是否位于第一个记录和最后一个记录,这在进行用户界面更新时很有用。4CFIELDEXCHANGE类支持记录字段数据交换RFX,即记录集字段数据成员与相应的数据库表的字段之间的数据交换。该类的功能与CDATAEXCHANGE类的对话框数据交换功能类似。413在MFC中应用ODBC编程在VC中编写一个简单地利用ODBC管理数据库的应用程序,通常需要完成如下一些步骤后台数据库使用ACCESS1用ACCESS创建数据库并在数据库内至少创建一个表,作为数据源。2在WINDOWS中配置ODBC数据源。3用VC中的向导APPWIZARD创建基本的数据库应用程序。4向基本数据库添加一些代码来实现一些APPWIZARD不能支持的功能,如删除、添加等功能,并创建数据库显示。下面依据上面的步骤来逐步实现数据库的设计与实现。42数据库中表的设计要建立数据库应用程序,必须先创建数据库并配置数据源。在本次设计中,我们运用ACCESS来建立数据库,库名为TRAIN_STATION,并在库中使用设计器创建表建立了一个名为“旅客信息”的表,如下图所示图41TRAIN_STATION数据库图42旅客信息表设计视图上表的概念结构设计是在需求分析的基础上进行的,将“旅客”定为实体,它的实体ER图为图43旅客实体ER图在“旅客信息”表中,共设置了十个字段的信息,分别是1ID字段数据类型为自动编号,设为主键;2旅客号字段数据类型为文本,并限定字段大小为16位,用于标识旅客在数据库中的唯一性,便于查找。该数据的前四位表示该名旅客上车站的编号,第58位表示年份,最后的8位表示从该站上车旅客的编号。例如若标识北京站的编号为0001,则“0001200400000001”就表示2004年从北京站上车的第一名旅客;3姓名字段数据类型为文本,并限定字段大小为8位,用于标识旅客的姓名信息;4身份证号字段数据类型为文本,并限定字段大小为18位,用于标识旅客的身份证信息;5车次字段数据类型为文本,并限定字段大小为4位,用于标识旅客乘座列车的编号信息;6检票时间字段数据类型为日期/时间,并设置数据格式为常规日期,用于保存旅客进站时的时间;7上车站字段数据类型为文本,并限定字段大小为8位,用于标记旅客入站的站名;8目的站字段数据类型为文本,并限定字段大小为8位,用于标记旅客出站的站名;9出站时间字段数据类型为日期/时间,并设置数据格式为常规日期,用于保存旅客出站时的时间;10下车站字段数据类型为文本,并限定字段大小为8位,用于标记旅客实际出站的站名。另外,该表规定旅客号和身份证号的索引是“有无重复”,即在库中最多出现一次,保证唯一性。具体情况见下表序号字段名数据类型大小是否可空0ID自动编号自动编号NOTNULL1旅客号文本16NOTNULL2姓名文本8NOTNULL3身份证号文本18NOTNULL4车次文本4NOTNULL5检票时间日期/时间14NOTNULL6上车站文本8NOTNULL7目的站文本8NOTNULL8出站时间日期/时间14YES9下车站文本8YES43创建并配置数据源首先,打开控制面板,双击图标,在用户DSN选项卡下单击“添加”按钮,在“创建新数据源”对话框中从驱动程序列表中选择“DRIVERDOMICROSOFTACCESSMDB”选项,如下图所示;然后单击“完成”按钮。图44打开数据源图45创建新数据源然后,在“ODBCMICROSOFTACCESS安装”对话框中填入数据源名“TRAIN_STATION”和说明信息,并单击“选择”按钮,在“选择数据库”对话框中选中“TRAIN_STATIONMDB”数据库,最后连续单击“确定”完成数据源配置。图46ODBCMICROSOFTACCESS安装图47选择数据源第五章程序设计与实现51程序的创建与数据库连接在本设计中,我们使用VC60来进行程序的实现。首先打开“FILE/NEW”菜单,选中“PROJECT”选项卡,选择“MFCAPPWIZARDEXE”选项,填入工程名“铁路客运安全服务系统”。在APPWIZARD第一步中应用程序类型指定为单文档,单击“NEXT”按钮进入下一步;在APPWIZARD第二步中选择DATABASEVIEWWITHOUTFILESUPPORT,单击“DATASOURCE”按钮,在DATABASEOPTIONS对话框中选择TRAIN_STATION数据源,并选中DYNAST选项。在选择了数据源之后,APPWIZARD将提示选择一个表,即选择本数据库中“旅客信息”表,如下图所示。图51数据源的选择52主窗体的设计本次设计的主窗体设计图如下所示,它除了提供各种功能和快捷按钮供管理员选择外,还是系统数据库显示模块和查询模块的主界面。主窗体菜单栏上的功能主要包括图52主窗体设计图1命令执行打开和关闭串口监听功能的操作,并可以对串口通讯的数据位、停止位、校验位、传输波特率和使用的端口号进行设置;2循环点名包括上车循环点名和下车循环点名,执行对各下位机的循环操作;3进站点名包含模拟的5个站点,可以对其中任意站点进行上车信息的点名;4出站点名包含模拟的5个站点,可以对其中任意站点进行下车信息的点名;5记录针对“当前旅客信息”栏的操作,通过看上一记录和看下一记录等可以查看库中所有记录,并可以清空数据库中全部的记录;6滚动字幕使主界面上的“欢迎进入铁路客运安全服务系统”字幕进行不停的滚动;7查看可以显示和隐藏工具栏和状态栏;8关于介绍此软件的相关信息等;9退出退出该系统。在主界面的左部提供了系统的查询功能,可以通过选择不同的条件来对库中记录进行不同的查询;右部则提供了对当前旅客信息的显示功能,它在默认状态下显示数据库中第一条记录信息。在主界面的下半部分是对数据库中旅客信息记录的显示,与当前旅客信息栏不同的是它能够显示库中的全部记录,并可通过其下方设置的控件来实现对其中记录的上下浏览。53数据库显示模块本设计的数据库显示模块,主要包括当前信息的显示和历史数据的显示,下面将一一介绍其实现过程。首先添加显示当前旅客信息的一般控件,如下表所示控件类型ID属性设置组框缺省当前旅客信息静态文本缺省ID编号静态文本缺省旅客号静态文本缺省姓名静态文本缺省身份证静态文本缺省车次静态文本缺省检票时间静态文本缺省上车站静态文本缺省目的站静态文本缺省出站时间静态文本缺省下车站编辑框IDC_ID缺省编辑框IDC_LKNO缺省编辑框IDC_NAME缺省编辑框IDC_SHENFEN缺省编辑框IDC_CHECI缺省编辑框IDC_JPTIME缺省编辑框IDC_UPSTATION缺省编辑框IDC_TARGETSTATION缺省编辑框IDC_CZTIME缺省编辑框IDC_DOWNSTATION缺省表51一般显示控件因为通过“当前旅客信息”组框查看以往的记录必须一页一页的翻动,比较麻烦。所以本程序提供了“数据库信息记录”的显示功能,即添加历史数据显示控件,它将数据库中的记录数据通过网格的形式显示给用户,类似于ACCESS或EXCEL显示模块。该功能的实现依赖于DBGRIDCONTROL网格控件和MICROSOFTREMOTECONTROL控件的协同工作。在VC60工作环境下,选择菜单PROJECTADDTOPROJECTCOMPONENTSANDCONTROLSGALLERY,在组件与控件选择对话框中双击REGISTEREDACTIVEXCONTROL目录进入ACTIVEX控件选择对话框,在该对话框中选中MICROSOFTREMOTEDATACONTROL控件,单击INSERT按钮,确认加入该组件;并在CONFIRMCLASSES对话框中选择要为使用该控件而加入铁路客运系统的包装类,在此仅选择CRDC类即可,最后单击CLOSE按钮完成。这时,在VC工作区的RESOURSEVIEW视图中可以将MICROSOFTREMOTEDATACONTROL控件拖入到对话框中,并对其属性进行设置。先用鼠标右键单击MICROSOFTREMOTEDATACONTROL控件,选择“PROPERTIES”项,在弹出的属性对话框中选中“CONTROL”选项卡进行具体的配置,控件的ID使用默认值,即IDC_REMOTEDATACTL1。图53MICROSOFTREMOTEDATACONTROL控件属性配置MICROSOFTREMOTEDATACONTROL控件在数据库和DBGIRDCONTROL控件之间起着桥梁作用,完成同数据源的绑定。依照上面的步骤,可以添加DBGIRDCONTROL控件,然后右击该控件,选择PROPERTIES项,在弹出的属性对话框中选中“ALL”选项卡,设置CAPTION标题属性为“数据库历史信息”,在DATASOURSE属性下拉列表中选择唯一可用的项IDC_REMOTEDATACTL1,即上文中设置的MICROSOFTREMOTEDATACONTROL控件ID,下图是该控件“ALL”选项卡的配置信息。图54DBGIRDCONTROL控件属性配置然后按照下表,添加DBGIRDCONTROL控件各列的信息。列号标题数据字段0ID编号COLUMN01旅客号COLUMN12姓名COLUMN23身份证号COLUMN34车次COLUMN45检票时间COLUMN56上车站COLUMN67目的站COLUMN78出站时间COLUMN89下车站COLUMN9表52DBGIRDCONTROL控件各列信息在完成控件的添加及属性配置后,利用CLASSWIZARD对上述控件添加相应的视图类成员变量,下图为配置的结果。最后,通过CLASSWIZARD为CTRAIN_STATIONVIEW重载ONMOVE函数,实现利用菜单栏中的“记录”菜单各子项或工具栏中的各工具按钮滚动查看数据库中的记录信息,关键代码如下而数据库历史记录的显示则通过每次接收新的记录后,运用刷新数据库的方式实现的,关键代码如下PVIEWM_DBGRIDREFRESHPVIEWUPDATEDATAFALSE此外,本设计还提供了对数据库记录清空的功能,可以清空前台主窗体上“当前旅客信息”和“数据库历史记录”,以及后台数据库中的记录,它由ONCLEAR函数来实现。54串口通讯模块串口通讯问题是本设计的重点。为了实现通讯,首先要和下位机共同协商确定通信的协议,然后运用VC来实现从串口缓冲区正确读取有用数据,并存入后台数据库中。541通讯协议的确定根据系统设计的要求,我们参考了NMEA0183通信协议的相关内容,设计确定了本次通信的协议。由于通信信息包括乘客进站信息和乘客出站信息,所以该协议的格式分为如下两种1进站格式共94位CRLFTS,U,旅客号,姓名,身份证号,车次,检票时间,

温馨提示

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

评论

0/150

提交评论