全自动异地数据库备份和恢复系统_第1页
全自动异地数据库备份和恢复系统_第2页
全自动异地数据库备份和恢复系统_第3页
全自动异地数据库备份和恢复系统_第4页
全自动异地数据库备份和恢复系统_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

PAGE36全自动异地数据库备份和恢复系统(自动化与电气工程学院指导教师:)摘要:随着数据库技术的不断发展,数据库的规模越来越大,其功能也越来越强大。互联网技术的飞速发展,使企业的信息数据量也急剧增长。因此提高数据的安全性和数据恢复能力一直是关注的焦点。实现一套安全的,方便的,自动的,经济的备份恢复系统非常有实际价值。数据库系统作为信息系统中的基础软件,其安全性问题十分重要。目前国内的数据库系统基本采用国外产品,必须确保对其进行安全利用和有效监控。本文在对数据库系统安全相关理论和技术进行探讨的基础上,基于安全性增强的思想,对SQLServer2000数据库的应用系统的安全增强进行了研究和探讨。本论文主要研究了目前信息安全的研究与发展以及数据库安全的现状;多角度地分析了数据库系统的安全性威胁和数据库安全性的基本要求。以SQLServer数据库为实例,对SQLServer数据库基于角色的权限管理,访问控制,审计监控、增量备份和数据恢复等关键性技术进行了深入研究。主要基于SQLServer数据库系统,对数据库存储及传输加密、用户口令认证,安全审计机制等给出了技术实现,并通过存储过程、函数和程序包的方法对现有的数据库系统安全功能加以改进。在VisualC++和SQLServer2000数据库的开发环境下,实现数据库的异地自动备份和恢复功能。关键词:数据库、VC、安全性、备份、恢复Abstract:Alongwiththedatabasetechnologydevelopment,thescaleofDatabasebecomelargerandlarger.Theirfunctionsareincreasinglypowerful.Internettechnologyisdevelopingatfullspeed,Enterpriseinformationanddatawasalsorapidgrowth.Thereforeimprovedatasecurityanddatarecoverycapabilityhasbeenthefocusofattention.Achievingasafe,convenient,automatic,economicsystemofbackupandrecoverydemonstratesverypracticalvalue.Asfoundationsoftwareofinformationsystem,itissignificantforitssecurity.Nowmostdatabasesystemsuseforeignproductinourcountry.Itshouldbesolvedhowtoensuresecureuseandauditeffectively.Basedonaplentyofpapers,technologyreportsanddissertations,thisdissertationsmakesomeresearchworkonthefieldofsecuretheoryandtechnologyandstudyonsecureenhancementbasedonSQLServerdatabasesystem.Thedissertationmainlystudiesinthecurrentinformationsecurityandthedatabasesecuritystatus.Thecharacteristicsandfundamentalrequirementofdatabasesecurityissuesareproposed.ForSQLServerdatabase,theaspectsofprivilegeadminbasedonroles,thegranularityaccesscontrol,auditandbackupandrestoretechnologyarediscussed.BasedonSQLServerdatabase,databasestorageandtransmitauthentication,userspasswordauthentication,secureauditarerealized.Databasesecurityfunctionsimprovebyprocedure,functionandprogrampackages.InVisualC++andSQLserver2000databasedevelopmentenvironment,accomplishdatabaseautomaticbackupandrecoveryfunctions.Keywords:Database、VC、Security、Copy、Restoration1前言1.1中日短信游项目简介“中日短信游”这一服务的推出主要是在中日交流越来越频繁,需求量越来越大,发短消息已经成为一个潮流,现在中日两国之间只能打电话,不能发短信,而电话费目前还相当昂贵,因此对于一般的用户来讲都会选择更为廉价的短消息,所以在这样一个背景下出现了中日短信游,短信收发量的空前膨胀造就了新一代的拇指一族;国际交流的频繁让世界变成了地球村。国际短信的发展势在必行,是以遍布世界的国际短信为目标。中文和日文自由互译信息传递及时准确。主要包括短信和邮件的相互技术,因为在中国的手机一般是没有邮件的,而只有短消息,而日本的手机恰好相反,日本的手机只有邮件,没有短消息这一服务,也没有短消息这一概念。因此,首先的技术问题就是对邮件和短消息进行相互转换。当然手机制式和语言文字的不同,中国手机的文字编码是以GB18030为准的,而日本是以SHIFT-JIS为准的,同样一个字所对应的文字代码就不一样了,这就需要建立相当完整的文字编码库。“国际译信宝”是基于互联网,为用户提供高质量的短信邮件语言翻译的一个平台。社会信息化进程不断加速,互联网的产品和服务层出不穷,人们在感受着网络给生活和工作带来方便与快捷的同时,也对互联网的产品和服务提出更多的期盼。国际交流日渐增多,不同语言间短信和邮件日益频繁。国际译信宝可以解除国际短信邮件之间语言不通所带来的烦恼。比如你给你的一位日本朋友发了一封中文电子邮件,那么通过“译信宝”,你的日本朋友就可以用日文直接看你的邮件了。当然,日本的手机一般都拥有一个个人的手机邮箱,手机跟邮箱就绑定是绑定在一起的,你可以通过对方的手机邮箱地址给他(她)发邮件,通过这样的一种方式,那么对方可以在第一时间用手机接受到您的邮件了。这个服务现在基本上以中文,日本,英文三种语言为主要的服务对象。1.2数据保护重要性研究1.2.1数据破坏的后果随着数据库技术的不断发展,从Foxpro到MicrosoftSQLServer和Oracle,数据库的规模越来越大,其功能也越来越强。互联网技术的飞速发展,使企业的信息数据量急剧增长。由于许多潜在的因素,如黑客攻击、病毒袭击、硬件故障和人为误操作等等,造成企业许多重要的数据丢失甚至全部业务陷于瘫痪状态,因此提高数据的安全性和数据恢复能力一直是用户和厂商关注的焦点。为了防止计算机灾难事故的出现,数据的备份和恢复的工作就成为了一项不可忽视的系统管理工作。拥有原始数据,就可以实现恢复,这就要求长期进行历史数据备份。因此拥有好的“数据保护系统”和“数据保护方案”,可以将损失减少到最低程度。通过备份可以保存相当完整的数据信息,因为数据出现问题而发生系统意外终端时,通过恢复系统把备份的数据在最短时间内恢复正常,保证系统提供服务的及时性、连续性。关键数据的备份与恢复操作已经成为系统日常运行维护的一个重要组成部分。而且企业及各级部门电子化程度越高,对计算机系统和网络的依赖也就越深,对备份的要求也就越高,规模更大、技术更新。数据的备份与恢复作为一种存储管理工作,在不同的企业、部门涉及到不同的业务需求(数据量、存储结构、管理成本等),有很多技术难点,需要较强的技术支持与服务。但是备份工作的主动性、实用性、完整性、经济性是存储管理工作共同的目标。1.2.2对现有备份和恢复机制的研究备份就是制作数据库结构、对象和数据的拷贝,以便在数据库遭到破坏的时候能够修复数据库。数据库备份是一项重要的日常性质的工作,是为了以后能够顺利地将破坏了的数据库安全地恢复的基础性工作。在进行数据库备份时,当系统的环境处于一种非正常的状态的时候才需要恢复,例如,系统整个硬件失败、系统软件瘫痪或者是由于误操作而删除了重要的数据等。MicrosoftSQLServer2000提供了几个数据备份选项:数据库全部备份,差异备份或增量备份,事务日志备份,文件备份、文件组备份。对于采取的备份策略,主要是怎么样的系统采取有针对性的备份手段。要建立一个完整的备份策略需要考虑很多因素,主要包括:①备份周期。根据数据的重要程序,可以选择每周、每日、每时进行备份。②使用静态备份还是动态备份,动态备份允许数据库运行时进行备份。③全备份还是增量备份。④使用什么介质,磁带还是磁盘。⑤使用人工备份还是设计好的自动备份程序。一般使用的备份策略可以通过以下几种方式实现:(1)定期手动备份数据库是一种最简单的方法,它能确保恢复大部分信息。(2)采用备份软件来对服务器系统做备份。常用的是Norton公司的磁盘备份工具—Ghost。该软件可以直接将磁盘上的某个分区或整个硬盘克隆成一个镜像文件,然后把它存放在别处,那么当该分区或硬盘出现问题时,使用Ghost在另一硬盘或分区上,利用镜像文件快速还原。(3)双机热备份方式,所谓双机热备份是指系统对主机及硬盘、通讯线路等核心设备,采用双机备份,当系统正常时主机进行工作,并且每隔设定时间系统自动检测,若发现问题,系统能够自动切换到备份机继续工作,保证不影响系统的正常运行。但双机热备份成本很高(4)使用最多的异机备份的策略,这也是最好最经济的备份方式。在局域网内的任何一台工作站计算机上安装MicrosoftSQLServer2000,并在该机上建立一个与服务器中的数据库同名的数据库,利用MicrosoftSQLServer2000系统本身提供的异机传送工具通过设置定时由计算机自动的把服务器中数据库的数据传送到该工作站机的数据库中,一旦出现问题,只要重装服务器操作系统重装MicrosoftSQLServer2000,仍然可以采用异机传送工具来通过该工作站机把数据传回至服务器的MicrosoftSQLServer2000数据库中,以确保数据的安全恢复。1.3系统实现功能介绍首先从数据备份的重要性考虑,拟定用VC+SQLSERVER编程来实现数据的随时自动备份功能。打破常规的人工的,数据库默认的备份模式。实现一个能够异地备份和恢复服务器数据的廉价的备份恢复系统,做到远程对数据库中数据的远程控制。1.4本论文的主要研究内容本研究的主要目的是在通过用VC编程实现对数据库数据进行异地自动实时备份和恢复功能,针对数据备份工作的目标:主动性、实用性、完整性、经济性。完成用底本低廉,实时,主动随控和数据完整的优点来替代数据库本地备份的成本高,空间小等备份模式。本文各章的主要内容如下:第一章,主要论述在公司中日短信游项目中对数据库中的数据保护重要性及其重要的前提,结合当前世界上对数据的保护技术显得尤为重要,研究解决针对本项目的数据保护功能,设计出操作方便,快捷但功能强大的数据备份恢复手段显得颇有意义。第二章,总结在程序开发环境研究与学习的过程中所用到的主要技术和遇到的主要难点问题。并提出针对性的解决方案。第三章,GUI(用户图形界面)设计。第四章,数据库管理功能的实现。第五章,系统的整机调试及性能测试。第六章,对本设计进行总结展望。2.程序开发环境研究与学习2.1windows程序运行原理2.1.1windows消息机制图2.1Windows应用程序,操作系统,计算机硬件之间的相互关系:应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。这个关系好比有个机器人能够完成行走的功能,但是,如果人们不告诉它往哪个方向上走,机器人是不会主动行走的。在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应。这些函数的集合就是Windows操作系统提供给应用程序编程的接口(ApplicationProgrammingInterface),简称WindowsAPI。从操作系统到应用程序表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何做出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件做出反应。对事件做出反应的过程就是消息响应。操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。2.1.2windows驱动模型传统的MS-DOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。一个程序是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。它的基本模型如图2.1.2(1)所示。图2.2过程驱动模型事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图2.2所示。图2.3事件驱动模型图2.3消息驱动模型2.2系统开发环境2.2.1VC开发环境介绍VC是Microsoft公司的重要产品之一-DeveloperStudio工具集的重要组成部分。它用来在Windows环境下开发应用程序是一种功能强大,行之有效的可视化编程工具。VC以可视化为基础,以C++语言为蓝本,以众多的集成工具为骨架,在计算机领域的诸多方面都发挥重要作用。VC提供了简介使用的开发环境,集成的工具集能够让用户高效率的开发应用程序。VC提供了MFC类库,一般性工作可以全部交给VC来完成,用户只要在其基础上做出自己想要的功能即可。与TurboC等工具相比,VC完成目标(尤其对于图形界面的程序)所花费的时间要少的多。visualc++是一种可视化的,面向对象的windows开发工具,它具易用,通用和开发效率高的特点。随着微软公司对它的不断地改进以及计算机本身在性能上的迅速提高,使得visualc++越来越适合于一般的应用程序开发。VC的核心-MFC类库已经是事实上的业界标准,它于visualstudio中的其他可视化开发工具紧密集成,可用于开发非常专业的windows,web和企业级应用程序图SQLSERVER2000简介MicrosoftSQLServer(简称SQLServer)是微软公司推出的一个高性能的关系型数据库管理系统,它具有客户/服务器体系结构,能够满足大规模分布式计算环境的需要。随着SQLServer产品性能的不断提高,使之在数据库系统领域中占有重要的地位。SQLServer系统之所以成为目前流行的大型商用数据库系统,有着其深刻的内在因素,这与它鲜明的特点是分不开的:与Internet的高度集成;高伸缩性和适应性;企业级数据库功能强大;易于安装和使用等特点是的它成为了数据库开发的一个很好选择。SQLServer2000与其它产品共同构成了可靠安全的Internet和Intranet系统的数据存储。例如:SQLServer2000与windows操作系统安全及加密工具共同实现安全的数据存储:SQLServer为在服务下运行或通过防火墙访问数据库的Web应用程序构成了高性能的数据存储服务;可与siteserver一起使用,建立并维扩大型的复杂电子商务Web站点;SQLServer2000TCP/IP套接字通讯支持可与MicrosoftProxyServer集成,以实现安全的Internet和Intranet通讯。SQLServer2000数据库引擎充分保护资料的完整性,同时将管理上千个并发修改数据库的用户的开销减到最小。其分布式查询使得引用来自不同资料源的资料,就好像这些资料是SQLServer数据库的一部分,同时分布式事务支持充分保护任何分布式资料更新的完整性。图2.52.3C++编程思想面向对象技术是目前流行的系统设计开发技术,它包括面向对象分析和面向对象程序设计。面向对象程序设计技术的提出,主要是为了解决传统程序设计方法——结构化程序设计所不能解决的代码重用问题。结构化程序设计从系统的功能入手,按照工程的标准和严格的规范将系统分解为若干功能模块,系统是实现模块功能的函数和过程的集合。由于用户的需求和软、硬件技术的不断发展变化,按照功能划分设计的系统模块必然是易变的和不稳定的。这样开发出来的模块可重用性不高。面向对象程序设计是一种围绕真实世界的概念来组织模型的程序设计方法,它采用对象来描述问题空间的实体。对象是包含现实世界物体特征的抽象实体,它反映了系统为之保存信息和与它交互的能力。它是一些属性及服务的一个封装体,在程序设计领域,可以用“对象=数据+作用于这些数据上的操作”这一公式来表达。类是具有相同操作功能和相同的数据格式(属性)的对象的集合。类可以看作抽象数据类型的具体实现。抽象数据类型是数据类型抽象的表示形式。数据类型是指数据的集合和作用于其上的操作的集合,而抽象数据类型不关心操作实现的细节。从外部看,类型的行为可以用新定义的操作加以规定。类为对象集合的抽象,它规定了这些对象的公共属性和方法;对象为类的一个实例。对象和类的关系相当于一般的程序设计语言中变量和变量类型的关系。面向对象的编程方法具有四个基本特征:1.抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。2.继承:

继承是一种联结类的层次模型,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这也体现了大自然中一般与特殊的关系。继承性很好的解决了软件的可重用性问题。比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。但是有的应用程序用于文字处理,有的应用程序用于绘图,这是由于派生出了不同的子类,各个子类添加了不同的特性。3.封装:

封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。在这个阶段定义对象的接口。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。4.多态性:

多态性是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑-粘贴操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。2.4SQLServer数据库系统2.4.1关系型数据库关系型数据库系统是当前最流行的数据库软件系统。它是一个非常复杂的软件系统,对数据序系统的所有操作,包括定义、查询、更新和各种运行控制最终都是通过它来实现的,因此它是使数据库系统只有资料共享、并发访问、资料独立等特性的根本保证。就关系数据库管理系统(RDBMS)而言,它是位于用户与操作系统之间的一层数据管理软件,它主要负责维持数据库中资料的关系,保障资料的正确存储,即保障定义资料之间的关系的种种规则不会被违背,在系统出错时,把资料恢复到一个能保证一致性的状态。2.4.1如图所示,SQLServer利用客户/服务器结构把工作分解成在服务器计算机上运行的任务和在客户计算机上运行的任务:客户负责商务逻辑处理,把资料呈现给用户。通常,客户在一个或多个客户计算机上运行,但也能在配有SQLServer服务器计算机上运行。SQLserver管理数据库,并在多个处理请求之间分配保存储区、网络带宽和磁盘操作等可利用的资源。客户/服务器体系结构,允许您为各类环境合理地设计和部署应用系统。客户编程接口允许应用运行在不同的客户机上,并通过网络与服务器通讯。图2.6客户/服务器体系结构示意图Transact-SQLTransact-SQL是结构化查询语言(SQL)的一种。SQLServer用Transact-SQL作为它的数据库查询和编程语言。Transact-SQL包含了管理SQLServer,在SQLServer中创建和管理所有对象,以及在SQLServer表中进行插入、更新、修改和删除资料的命令。Transact-SQL是在国际标准化组织(ISO)和美国国家标准化机构(ANSI)定义了的SQL标准基础上的扩展。2.4.2SQLServer数据管理在某种程度上,几乎所有大大小小的商务系统都依赖于数据库技术。这种商业的竞争使得某些系统凸现出其卓越的特性。尽管维持许多数据库服务器不知疲倦地高效运转的确是一件比较困难的事,但是更困难的是确保为合适的人提供合适的信息,并利用这些信息提供强大的分析能力为各种商业活动创造更大的获利空间。能够完成这些工作的系统的确不多,MicrosoftSQLServer便是其中杰出的一个。SQLserver用户认证安全帐户认证是用来确认登录SQLServer的用户的登录帐号和密码的正确性,由此来验证其是否具有连接SQLServer的权限。SQLServer2000提供了两种确认用户的认证模式:一种为WindowsNT认证模式。另一种是混合认证模式。在windowsNT认证模式下,SQLServer数据库系统通常运行在WindowsNT服务器平台上,而NT作为网络操作系统,本身就具备管理登录、验证用户合法性的能力,因此WindowsNT认证模式正是利用了这一用户安全性和帐号管理的机制,允许SQLServer也可以使用NT的用户名和口令。在这种模式下,用户只需要通过WindowsNT的认证,就可以连接到SQLServer,而SQLServer本身也就不需要管理一套登录数据。在混合认证模式下混合认证模式允许用户使用WindowsNT安全性或SQLServer安全性连接到SQLServer,这就意味着用户可以使用他的帐号登录到WindowsNT,或者使用他的登录名登录到SQLServer系统。NT的用户既可以使用NT认证,也可以使用SQLServer认证。数据库的建立创建Users用户表的如下,设置字段ID为主键,增量为1,其创建的SQL语句如下:CREATETABLE[USERS]( [ID][int]IDENTITY(1,1)NOTNULL, [USERID][int]NOTNULL, [EMAILADDRESS][varchar](80)COLLATEChinese_PRC_CI_ASNOTNULL, [PASSWORD][varchar](100)COLLATEChinese_PRC_CI_ASNOTNULL, [PHONENO][varchar](15)COLLATEChinese_PRC_CI_ASNULL, [NAME][varchar](40)COLLATEChinese_PRC_CI_ASNULL, [FAMILYNAME][varchar](40)COLLATEChinese_PRC_CI_ASNULL, [BIRTHDAY][datetime]NULL, [SEX][char](4)COLLATEChinese_PRC_CI_ASNULL, [AREA][varchar](4)COLLATEChinese_PRC_CI_ASNULL, [JOB][varchar](4)COLLATEChinese_PRC_CI_ASNULL, [ADDRESS][varchar](80)COLLATEChinese_PRC_CI_ASNULL, [ETC][text]COLLATEChinese_PRC_CI_ASNULL, [LANG][varchar](4)COLLATEChinese_PRC_CI_ASNULL, [SPAREEMAIL][varchar](80)COLLATEChinese_PRC_CI_ASNULL, [STATUS][varchar](80)COLLATEChinese_PRC_CI_ASNULL, [REGISTERTIME][datetime]NULL, [LOGINTIME][datetime]NULL, [LOGOUTTIME][datetime]NULL, [SOURCE][varchar](10)COLLATEChinese_PRC_CI_ASNULL, [MSGCOUNT][int]NULL, [SUMCOUNT][int]NULL, [TYPEID][int]NULL, [FEEDBACK][int]NULLCONSTRAINT[DF_USERS_FEEDBACK]DEFAULT(1), CONSTRAINT[PK_USERS]PRIMARYKEYCLUSTERED ( [ID] )ON[PRIMARY])ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]3图形用户界面设计图形用户界面

(GUI)编程是在windows平台下开发应用程序,Microsoft公司提供的VisualC++提供了完全可视化的开发环境。在我的界面设计中,主要包括了图形界面的建立和对话框的使用,如何应用windows系统下VC的各个控件。对界面编程中的用户交互技术的灵活应用。3.1用户功能对话框设计与实现如图3.1所示:图3.1用户交互对话框界面该界面让用户能轻松的实现对数据库进行异地备份恢复功能,用户按下搜索按钮,程序通过对数据库的查询,继而在各控件上显示出用户的各项查询信息。按下备份按钮,程序就会对数据库中相对应的数据表中的数据进行拷贝,并存放在程序主目录下的一个backup文件下,并以.txt文件进行存盘。只要按动一次备份按钮,程序就会自动实现这个时刻数据库中数据的备份工作。恢复功能,按动恢复键,程序会搜寻所有已备份的文件,并以list表的形式显示出来,用户可以选择对数据库恢复是用什么时刻备份下来的文件的数据。按下确认键,系统就会自动把此备份文件里的数据写入数据库中对应的表中,完成恢复功能。3.2VC中界面元素的设计用户界面中主要用到的控件有用来显示静态文本内容的statictext,进行数据交换和文字显示的editbox,用来框定控件编排的groupbox,button按钮以及显示数据列表的listcontrol控件。界面最上方的三个控件是用来动态显示数据库里查询后的相关内容,对符合条件的记录进行数据统计,并用事先规定好的格式读入editbox中显示。接下来的两个Listcontrol控件,主就要是用来完成相应具体的数据记录一条条的在列表中排列显示,并可做到按条件的排列。在数据库异常日志中,采用editbox来捕获异常信息,把异常信息发生的时间和原因在其中显示出来。并实时的写入日志文件中。下面着重讲述一下列表控件(ListContro1)的应用:在对数据库的操作中,经常遇到对数据库的内容进行显示、修改、删除和保存的问题。一般情况下,数据库的容量很大,因此在显示数据库的内容时,需要一定的表格形式,并能够在其上完成对数据库的数据进行显示、修改、删除和保存的工作。在VC中做得最多的是利用创建GridCtrl表格窗口和列表控件显示数据库。列表控件是VC++的一个常用控件,主要用来以各种方式显示一组数据记录供用户进行各种操作,列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多种属性值。LVS_ICON,LVS_SMALLICON,LVS_LIST、LVS_—REPORT这四种风格决定控件的外观,同时只可以选择其中一种,分别对应大图标显示,小图标显示,列表显示,详细报表显示。其中,详细报表显示方式表格的列表项可以任意置,在列表控件属性设置完后,通过功能函数与数据源连结,列表框内将会对数据源列表项实时地显示。列表控件的操作函数包括插入一个新的表项Insertltem、删除一个表项Deleteltem、排序表项Sortltems、测试列表的位置HitTest、重绘表项RedrawItems、插入一个表列InsertColumn、删除一个表列DeleteColumn编辑一个表项文本EditLabel和重绘个表项Drawltem等。在实践中,把列表控件与ODBC函数连结在一起,可以在任意普通应用程序中创建对话框来实现对数据库的显示,相当方便快捷。3.3用户界面设计的关键技术3.3.1轻松实现换肤功能首先是在工程目录下选择project目录下的setting选项,选择link目录项,在object/librarymodules下面填入你要加载的皮肤动态链接库文件SkinPlusPlus.DLL文件。然后将SkinPlusPlus.DLL和SkinPlusPlus.lib及要加载进去的皮肤文件blanco.ssk和SkinPlusPlus.h加入到工程目录下,当然了,必须在app主程序中包含进SkinPlusPlus.h的头文件。接着就是在app主程序中的.CPP源文件中在类CChkSQLServerApp进行InitInstance时,把皮肤的更新过程也同时实例化,添加InitializeSkin(_T("blanco.ssk"))。这样我们就可以随心所欲的更换自己想要的界面皮肤了,只要在工程目录下加入自己想要的皮肤文件,然后在initializeSkin函数中更改加入的皮肤文件名就可以了。3.3.2窗口隐藏及任务栏托管在主界面上点击隐藏按钮后程序窗口自动消失,并在任务栏中出现该程序的icon图标,给任务栏托管并对window消息进行相应。其中程序中nid对象的uCallbackMessage属性就是用来接受windows消息机制的显示任务消息。而hicon属性则是用来显示在任务栏中托管时程序的图标显示所对应的ID。其实现的程序代码:voidCChkSQLServerDlg::OnHide(){ NOTIFYICONDATAnid; nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; nid.uCallbackMessage=WM_SHOWTASK; nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip,"SMSMAILchkSQLServer"); Shell_NotifyIcon(NIM_ADD,&nid); ShowWindow(SW_HIDE);}两个参数分别为wParam和lParam,wParam用来接收的是图标的ID,而lParam则是接收的是鼠标的行为。两种消息相应的情况,一种时右键起来时弹出快捷菜单,这里只有一个“关闭”。另外一种时对双击左键的处理。GetCursorPos(lpoint)是得到鼠标位置,menu.CreatePopupMenu()则是声明一个弹出式菜单。增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭")是用来确定弹出式菜单的位置,最后就是对资源的回收操作。LRESULTCChkSQLServerDlg::onShowTask(WPARAMwParam,LPARAMlParam){ if(wParam!=IDR_MAINFRAME) return1; switch(lParam) { caseWM_RBUTTONUP: {LPPOINTlpoint=newtagPOINT; GetCursorPos(lpoint); CMenumenu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); HMENUhmenu=menu.Detach(); menu.DestroyMenu(); deletelpoint; }break;caseWM_LBUTTONDBLCLK: {this->ShowWindow(SW_SHOW);}break; } return0;}CChkSQLServerDlg类中的OnDestroy()函数一般都是在当应用程序中有隐藏到任务托盘上的操作时必须用到的。其作用就是用来当点击图标后关闭操作时,保证关闭的时当前的应用程序,而非其他的应用程序。tnid.uID=IDR_MAINFRAME就是为这个应用程序所对应的标识。voidCChkSQLServerDlg::OnDestroy(){ KillTimer(READ_SQL); KillTimer(BACKUP_SQL); CDialog::OnDestroy(); NOTIFYICONDATAtnid; tnid.cbSize=sizeof(NOTIFYICONDATA); tnid.hWnd=this->m_hWnd; tnid.uID=IDR_MAINFRAME; Shell_NotifyIcon(NIM_DELETE,&tnid);}4数据管理功能的实现4.1VC访问数据库方式使用VC++访问数据库,可以有不同的方式。充分掌握这些方式,有助于提高开发效率。(1)ODBC。ODBC是为了给访问关系数据库时提供一个统一的接口,所以,对于不同的数据库,ODBC提供了一套统一的API。应用程序可以应用所提供的API来访问任何提供了ODBC驱动程序的数据库。由于ODBC已经成为一种标准,所以,一般来说,目前的关系数据库都提供了ODBC驱动程序,这使ODBC的应用非常广泛,基本上可用于所有的关系数据库。但ODBC只能用于关系数据库,使用ODBC很难访问对象数据库以及其他的非关系数据库、顺序文件等。ODBC是一种底层的访问技术。ODBCAPI可以使客户端应用程序能够从底层设置和控制数据库,完成一些高层数据库无法完成的功能。(2)DAO。DAO提供了一种通过程序代码创建和操纵数据库的机制。它是微软推出的用于在VisualC++中访问MicrosoftJet数据库文件的强有力的开发工具,它通过对DAO对象的封装,提供DAO丰富的数据库访问和数据库操纵手段。通过DAO技术,可以访问从txt文件到大型后台数据库的多种数据格式。(3)OLEDB。OLEDB技术是VisualC++开发数据库中所提供的新技术,与传统的数据库访问技术相比,该技术有2种重要的改进:基于COM接口和对所有的文件系统包括关系数据库和非关系数据库提供了统一的接口,这些特性使OLEDB技术比传统的数据库访问技术更优越。与ODBC相似,OLEDB属于访问数据库技术的底层接口。(5)ADO。OLEDB是对传统的数据库访问技术的扩展,可以提高数据库应用的访问能力。但用OLEDB开发应用程序要编制大量的代码。VisualC++中提供了面向对象的OLEDB技术,即ADO。AD0技术也是基于0LEDB的访问接口,它继承了OLEDB技术的优点,并且,ADO对0LEDB的接口做了封装,定义了ADO对象,使程序开发得到简化,ADO技术属于数据库访问的高层接口。4.2ODBCD连接数据库4.2.1ODBC原理ODBC(OpenDatabaseConnectivity)是Windows环境下的一种标准的数据源开放数据库连接技术,它是Microsoft公司对数据库进行访问的标准应用程序编程接口,是Windows开放式服务体系结构OSA的一部分,它使用结构化查询语言SQL来存取数据。可以用于访问来自多种数据库管理系统的数据,而实现这些任务,只需使用0DBC数据源管理器添加相应的数据源、配置相应的驱动程序、访问方式即可。使用ODBC可以让应用程序避免直接与数据源生成系统相联的复杂性,而通过SQL简单、直接地使用数据库。图4.1ODBC关系图ODBC的原理如图4.1.1所示,其中应用程序不是直接和生成数据库的DBMS打交道,而是通过ODBC间接实现对数据库中数据的访问(包括查、增、改、删等操作)。可以大大方便我们使用各种语言开发各种类型的数据库应用程序。4.2.2MFC提供的ODBC数据库类Microsoft基础类库简称MFC,按照应用的功能可划分为根类,MFC应用结构类,窗口、对话和控件类,绘画和打印类,简单的数据类型类,数组、列表和映射类,文件和数据库类,网络类,OLE类,调试和异常类等类。其中的数据库类是数据库应用编程方面的重要支持。MFC提供了几个用于数据库开发的类,主要有CDatabase,CRecordSet和CRecordView等类。CDatabase类对象用于实现对数据源的连接,通过它可以实现对数据源的各种操作及操作特性。CRecordset被称作“记录集”类对象,代表从一个数据源选择出来的一组记录的集合。该对象可以以动态集和快照两种形式使用。动态集是与其它用户的更新保持同步的动态数据集。快照是数据的静态视图。每一种形式都代表打开记录集时固定的一组记录。但是当滚动到动态集中的一个记录时,动态集将反映后来由其它用户或由应用程序中其它记录集对此记录所做的改变。CRecordView对象是在控件中显示数据库记录的视图,是一种直接连接到一个CRecordset对象上的格式视图。CRecordView对象利用对话框数据交换(DDX)和记录字段交换(RFX)机制,使格式视图上的控件和记录集的字段之间的数据移动自动化。CRecordView还提供了完成移动到第一个,下一个,上一个或最后一个记录的缺省实现,和一个用于更新视上面的当前记录的接口,CRecordView类的对象能以控制的形式显示数据库记录。4.2.3ODBC连接数据源打开控制面板,找到管理工具下的ODBC数据源,添加安装SQLServer数据源驱动程序。在向导中输入所要连接的数据库服务器的IP地址和数据源名称。然后在更改默认的数据库选项当中选择你所要操作的数据库名称。这样程序就可以通过这个数据源直接跟这个数据库联系起来了。图4.2在datatype.h这个头文件中定义数据源连接命令和数据库命令,"DSN=Message;SERVER=7;UID=zust;PWD=goodvista;"DB_NAME为"USEmessage;"。此时,这样数据源的连接已经完成。4.3数据库查询统计4.3.1程序主界面初始化在程序一开始运行时,对话框进入初始化过程,在对话框主界面初始化函数OnInitDialog()中需要完成对定时器的设置和listcontrol控件的属性的生成。我的程序应用了两个定时器分别用来设定数据库查询时间和对数据库数据备份时间间隔。定时器的设置首先传入两个参数READ_SQL和BACKUP_SQL用来分别标识区别两个定时器。其次需要的参数是设置定时器触发的时间。SetTimer(READ_SQL,READ_SQL_TIMER*60*TICKS,NULL);SetTimer(BACKUP_SQL,BACKUP_SQL_TIMER*60*TICKS,NULL);与此同时初始化的是最近10天内注册的新会员关联的listcontrol控件。其ID对应的变量为m_MEMBERS,完成背景和标题栏的初始化工作。 m_MEMBERS.SetExtendedStyle(m_MEMBERS.GetExtendedStyle()|LVS_EX_FULLROWSELECT); m_MEMBERS.SetBkColor(0x00EFFFEF); m_MEMBERS.SetTextColor(0x00009000); m_MEMBERS.SetTextBkColor(0x00EFFFEF); m_MEMBERS.InsertColumn(0,"会员ID",LVCFMT_LEFT); m_MEMBERS.InsertColumn(1,"邮箱地址",LVCFMT_LEFT); m_MEMBERS.InsertColumn(2,"电话号码",LVCFMT_LEFT); m_MEMBERS.InsertColumn(3,"性别",LVCFMT_LEFT); m_MEMBERS.InsertColumn(4,"注册日期",LVCFMT_LEFT); m_MEMBERS.InsertColumn(5,"服务次数",LVCFMT_LEFT); m_MEMBERS.InsertColumn(6,"剩余点数",LVCFMT_LEFT); m_MEMBERS.SetColumnWidth(0,60); m_MEMBERS.SetColumnWidth(1,250); m_MEMBERS.SetColumnWidth(2,90); m_MEMBERS.SetColumnWidth(3,40); m_MEMBERS.SetColumnWidth(4,100); m_MEMBERS.SetColumnWidth(5,60); m_MEMBERS.SetColumnWidth(6,100);4.3.2数据库查询统计本系统执行流程:客户端客户端用户对话框用户对话框备份恢复搜索备份恢复搜索打开备份文件数据库连接连接数据库打开备份文件数据库连接连接数据库查询显示文件内容插入数据库创建.txt文件查询显示文件内容插入数据库创建.txt文件读取数据库各字段写入文件读取数据库各字段写入文件服务器主机服务器主机图4.3系统程序流程图首先定义一个指向系统定义的tm类型的结构提指针*nt;用来保存localtime()所获取的时间,接着定义charoutstr[256]数组,存放经过格式之后的时间字符串变量。其实现形式为sprintf(outstr,"%4d年%2d月%2d日%2d时%2d分%2d秒:%s",1900+nt->tm_year,nt->tm_mon,nt->tm_mday,nt->tm_hour,nt->tm_min,nt->tm_sec,str);这样在outstr数组中就存放着当前时刻的时间,这样系统的当前时间就获取了。定义CDatabase类的对象db用来对数据库的连接。考虑到由于远程客户端上运行该程序的时候,对数据库的读取速度会比较慢,因此设置db的连接超时时间为3分钟。接着连接数据库,同时捕捉意外的错误,把错误信息用AddMessage()写入界面控件的异常信息editbox中,与此同时,把错误的日志用Log()写入日志文件中。try { db.ExecuteSQL(DB_NAME); } catch(CDBExceptione) { str.Format("->db.ExecuteSQL(DB_NAME)Error,[%s].",e.m_strError); AddMessage(str); Log(str); returnfalse; }记录集与数据源之间有一个数据交换问题.CRecordset类使用"记录域交换"(RecordFieldExchange,缩写为RFX)机制自动地在域数据成员和数据源之间交换数据.RFX机制与对话数据交换(DDX)类似.CRecordset的成员函数DoFieldExchange负责数据交换任务,在该函数中调用了一系列RFX函数.当用户用ClassWizard加入域数据成员时,ClassWizard会自动在DoFieldExchange中建立RFX。 CRecordsetrs1(&db); CDBVariantuserid; CDBVariantemailaddress; CDBVariantphoneno; CDBVariantsex; CDBVariantregistertime; CDBVariantlogintime; CDBVariantlogouttime; CDBVariantmsgcount; CDBVariantsumcount; intyear,month,day; unsignedlongintdays; intusers_y=0,users_m=0,users_d=0; inti=0; CStringtxt; initList(); sql.Format("SELECT*FROMUSERSWHERE2>1;"); rs1.Open(AFX_DB_USE_DEFAULT_TYPE,_T(sql)); if(!rs1.IsEOF())rs1.MoveFirst(); while(!rs1.IsEOF()) { rs1.GetFieldValue("userid",userid); rs1.GetFieldValue("emailaddress",emailaddress); rs1.GetFieldValue("phoneno",phoneno); rs1.GetFieldValue("sex",sex); rs1.GetFieldValue("registertime",registertime); rs1.GetFieldValue("logintime",logintime); rs1.GetFieldValue("logouttime",logouttime); rs1.GetFieldValue("msgcount",msgcount); rs1.GetFieldValue("sumcount",sumcount); year=registertime.m_pdate->year; month=registertime.m_pdate->month; day=registertime.m_pdate->day; days=year*365+month*30+day; if(year==this_year)users_y++; if((year==this_year)&& (month==this_month))users_m++; if((year==this_year)&& (month==this_month)&& (day==this_day))users_d++; if(days>=this_days-10) { m_MEMBERS.InsertItem(i,_T(*emailaddress.m_pstring)); txt.Format("%d",userid.m_lVal); m_MEMBERS.SetItemText(i,0,txt); m_MEMBERS.SetItemText(i,1,_T(*emailaddress.m_pstring)); m_MEMBERS.SetItemText(i,2,_T(*phoneno.m_pstring)); m_MEMBERS.SetItemText(i,3,_T(*sex.m_pstring)); txt.Format("%4d年%2d月%2d日",year,month,day); m_MEMBERS.SetItemText(i,4,txt); txt.Format("%d",msgcount.m_lVal); m_MEMBERS.SetItemText(i,5,txt); txt.Format("%d",sumcount.m_lVal); m_MEMBERS.SetItemText(i,6,txt); if(i>=MAX_NEW_USERS)break; userid_list[i]=userid.m_lVal; i++; } rs1.MoveNext(); } rs1.Close();定义一个记录集,并且与前面定义过的CDatabase类中的对象db相关联。针对数据库中数据表的各个字段,对应的定义CDBVariant类型的变量,CDBVariant类的对象对MFC的ODBC表现了一个多种类型的变量。程序代码中定义的CDBVariant类的对象用GetFieldValue()分别用来存放users表中的各个字段的值。在ListCtrl控件中动态的插入item,并且对每个item进行赋值显示。执行查询后结果如图:图4.44.4数据备份功能 当按下备份按钮,程序就开始自动备份服务器数据库中相应表的数据。打开数据库连接,将数据库表中各个字段的内容用GetFieldValue()函数取出,放入用CDBVariant类型定义的变量当中。创建一个可读写的空文件,用来存放CDBVariant类型变量中的值。用当前时间做为创建新文件的文件名后加备份数据表的名字,接着,定义一个buffer用来存放要写入文件的数据。用fputs(buf,fp)把buf中的数据写入fp所指向的文件中,刷新文件fflush(fp)后关闭文件。其实现形式如下:FILE*fp=NULL;sprintf(filename,"BACKUP\\%04d%02d%02d_%02d%02d%02d_%s",this_year,this_month,this_day,this_hour,this_min,this_sec,USERS_STORE_FILE);fp=fopen(filename,"wt");memset(buf,0,sizeof(char)*8192);sprintf(buf,"INSERTINTOUSERS(userid,emailaddress,password,phoneno,name,familyname,birthday,sex,area,job,address,etc,lang,spareemail,status,registertime,logintime,logouttime,source,msgcount,sumcount,typeid)VALUES(%ld,\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%04d-%02d-%02d\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%04d-%02d-%02d%02d:%02d:%02d\',\'%04d-%02d-%02d%02d:%02d:%02d\',\'%04d-%02d-%02d%02d:%02d:%02d\',\'%s\',%ld,%ld,%ld);\r\n",userid.m_lVal,_T(*emailaddress.m_pstring),_T(*password.m_pstring),_T(*phoneno.m_pstring),_T(*name.m_pstring),_T(*familyname.m_pstring),birthday.m_pdate->year,birthday.m_pdate->month,birthday.m_pdate->day,_T(*sex.m_pstring),_T(*area.m_pstring),_T(*job.m_pstring),_T(*address.m_pstring),_T(*etc.m_pstring),_T(*lang.m_pstring),_T(*spareemail.m_pstring),_T(*status.m_pstring),registertime.m_pdate->year,registertime.m_pdate->month,registertime.m_pdate->day,registertime.m_pdate->hour,registertime.m_pdate->minute,registertime.m_pdate->second,logintime.m_pdate->year,logintime.m_pdate->month,logintime.m_pdate->day,logintime.m_pdate->hour,logintime.m_pdate->minute,logintime.m_pdate->second,logouttime.m_pdate->year,logouttime.m_pdate->month,logouttime.m_pdate->day,logouttime.m_pdate->hour,logouttime.m_pdate->minute,logouttime.m_pdate->second,_T(*source.m_pstring),msgcount.m_lVal,sumcount.m_lVal,Typeid.m_lVal);rs.MoveNext();rs.Close();fflush(fp);fclose(fp);这样,备份数据的功能就完成了,在工程的backup目录下,就以.txt文件形式完整的保存了所要备份的数据,文件名就是当前备份时间和数据表名称的组合。其结果如图:图4.5打开.txt文件,里面就是一个SQL语句,此SQL语句是为接下来的恢复工作做准备的。SQL语句中存着各条数据记录的值。打开文件后如图:图4.64.5数据恢复功能数据恢复是当数据库发生异常时需要将数据恢复到以前的某个时刻所需用到的操作。其目的就是为了让数据库在不正常的情况下对数据进行复原。当用户需要对现有数据库数据进行恢复操作,按下恢复按钮,程序会自动搜索备份目录下的.txt文件,弹出与用户交互的对话框,该对话框中的ListCtrl列出了所有在Backup文件夹下面所备份下来的.txt文件,恢复前先是否清空原表,是用来让用户在恢复操作之前,是在原先的数据表的基础上对记录的全部恢复还是先删除数据表后重新建表后插入数据。图4.7 CStringsearchpath,type; searchpath.Format("BACKUP\\*.txt"); HANDLEhFind; WIN32_FIND_DATAfd; intcount=0; hFind=::FindFirstFile(_T(searchpath),&fd); if(hFind!=INVALID_HANDLE_VALUE) { do { filename.Format("BACKUP\\%s",fd.cFileName); m_FILES_LIST.InsertItem(count,fd.cFileName); m_FILES_LIST.SetItemText(count,0,_T(filename)); } while(::FindNextFile(hFind,&fd)); } else { if(IDOK==MessageBox("没有备份的文件","",NULL)) {

温馨提示

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

评论

0/150

提交评论