基于不同高级语言环境下关系型数据库应用系统的设计与实现
2013-04-29隋东
隋东
【摘要】本文尝试将SQL语言嵌入到VB6.0、VB.NET和C#高级语言中,开发设计一个具有增、删、改和查询功能的学生成绩管理系统,对其中运用的关键技术进行剖析和对比。并在对各种理论进行阐述的同时配合系统的实现和关键技术的应用加以说明。
【关键词】ADO.NET VB6.0 VB.NET C# SQL SERVER T-SQL 类
【中图分类号】G42 【文献标识码】A 【文章编号】2095-3089(2013)05-0243-03
前言
中央广播电视大学的数据库应用技术教材是基于VB6.0和SQL SERVER2000实验环境下的,这为我们的数据库应用技术教学实践带来一些困扰和不便,尤其不便于学生课后更准确有效地自学教材。对此问题,笔者借助多年教学经验的积累,将中央电大本门课程的形考任务“数据库应用系统开发”在VB6.0、VB.NET和C#多种环境下的实现进行了思考和实验,对不同环境下的数据库应用系统设计实现方法和关键技术进行了比较,能够有效地指导学生在不同应用程序开发环境下,以简捷的方式、方法,较快地设计、实现一个具备增、删、改、查询功能的小型数据库应用系统,同时满足了学生接受新事物、新技术的愿望,激发了他们搞好毕业设计的创作热情,为学生们后续毕业设计打下了坚实的基础。
实现
本系统是基于 C/S 结构的信息管理系统,分别使用 VB6.0、VB.NET和C#作为开发语言,前端应用程序通过ADO、ADO.NET技术来与数据库进行连接,优点是易于使用、高速度、低内存支出和占用磁盘空间较少。
该数据库应用系统虽然规模小,但是已经具备增加、修改、删除、查询等系统功能。下面介绍一下系统开发的主要方法:
一、进行数据库设计
(一)需求分析
1.业务流程分析
“学生成绩管理系统”,主要目的是用以实现学生、课程以及成绩等多项管理。本系统管理的对象简单,每个数据之间都有较强的关联性,涉及过程并不复杂。因此,比较适合于数据库管理。
2.数据流程分析
图1学生成绩管理数据流程图
(二)概念结构设计
根据需求分析的结果,进行概念结构设计,依照收集信息→标识对象(实体)→标识每个对象需要存储的详细信息(属性)→标识对象之间的关系的步骤,采用E-R图工具表示,设计结果如图2所示:
图2学生成绩管理E-R图
(三)逻辑结构设计和物理实现
逻辑结构设计的方法与步骤,是将概念结构设计的结果E-R图转换为某个DBMS所支持的数据模型,并对其进行优化的过程。具体过程为:
将各实体转化为对应的表,将各属性转化为各表对应的列;标识每个表的主键列;在表之间体现实体之间的映射关系,遵守参照完整性规则;根据范式理论,对表进行修改,尽量满足第三范式。
通过规范化数据库设计,可以减少存储的冗余数据量,减轻数据维护工作,减少存储的要求,提高数据库的完整性。
物理实现阶段的主要工作是,把设计好的数据库全局模式转换为相应的内模式。在此用以上方法建立一个名称为“学生成绩管理”的数据库,其中包含3张数据表,即学生情况表、课程情况表、学生成绩表。
二、操纵和访问数据库的基本SQL语句
SQL是关系数据库支持的标准查询语言,也是一种双重式语言,即用于查询和更新的交互式数据库语言(Interactive SQL),又是一种应用程序进行数据库访问时所采取的编程式数据库语言,即嵌入式SQL(Embedded SQL)[1]。嵌入式SQL是数据库应用程序的一种开发方法。它要将SQL语句直接嵌入到程序的源代码中,与其他程序设计语言语句混合使用。
开发的应用程序将针对上述数据库进行管理,主要有插入(insert)、修改(update)、删除(delete)、查询(select)和打印(print)等5种基本的操作。
三、界面设计
(一)创建项目工程
项目工程名称为“学生成绩管理”。
(二)创建主窗体
运用菜单技术创建主窗体。
(三)创建增加、删除、修改、查询功能窗体
使用标签、文本框、组合框、表格、命令按钮等控件,添加并创建“查询记录”、“增加新记录”、“修改记录”、“删除记录”等窗体。
四、代码设计
.NET框架的一个主要组成部分是类库,这些类被拆分为命名空间,它是类库的逻辑分区。类库所采用的命名空间是层次结构,即命名空间下又可以再分成子命名空间,每个命名空间都包含一组按照功能划分的相关的类。
在.NET环境下,必须指向包含所使用类的命名空间(例如Imports System.Data,Imports System.Data.SqlClient)才能激活相应的类;借助于封装,把常用的数据连接、数据库查询和对数据库操纵的功能模块定义为公共函数,包括createConn()用于建立数据库连接的函数,sqlUpdate()用于对数据库操纵的函数,sqlfind()用于数据库查询的函数;使用时调用即可,避免相同功能模块的重复建设。针对该系统,笔者创建了SqlConnection、SqlCommand公共类的实例和系统常用的公共函数。
在不同模块的设计中都可以调用这些自定义函数,在此不再赘述。
五、报表设计
一个功能完整的数据库应用系统,除了具有数据维护、查询和显示功能外,还必须具有报表输出功能。Visual Studio2005报表体系结构图],其ReportViewer控件负责解释RDLC报表定义、处理报表参数并按照各种用户可选格式提供报表的“报表处理器”。它既可以运行于“本地模式”也可以运行于“远程模式”[2]。由用户编写的存储过程负责管理连接或运行基于参数的查询;报表只驻留以报表为中心的Parameters集合,寻址远程报表服务并呈现给用户。
六、几种实现方法的比较
嵌入式SQL在VB6.0下和在VB.NET下使用的基本形式和处理过程对比如下:
(一)在VB6.0环境下的具体实现
ADO是微软公司提出的第三种数据库访问对象,它把OLE DB封装在一个数据对象中,使得VB6.0程序可以方便地实现对数据库的访问。ADO对象模型共包含7个对象,即Connection,command,Recordset,Parameter,Property,Field和Error。
VB6.0应用程序中主要用Connection对象建立与数据库的连接,用Recordset和Field对象,对数据表进行操作,实现数据表增加、删除、修改等不返回结果集的操作,语法参阅文献[1]。
(二)在VB.NET环境下的具体实现
ADO.NET是微软.NET Framework框架中针对与数据库进行交互的一组对象类的名称[3]。ADO.NET提供对Microsoft SQL Server、Oracle等数据源以及通过 OLEDB和XML公开的数据源的一致访问,也就是提供与数据源进行交互的相关的公共方法。应用程序可以使用ADO.NET来连接到这些数据源,并检索、操作和更新数据。
ADO.Net比ADO更适用于分布式应用环境,增加了更好的性能;它有更好的可操作性、它可以结合XML语言来开发数据库;它有更好的可维护性、可编程性和可伸缩性。
ADO.NET对象模型中包含五个主要的组件,即是Connection对象、Command对象、 Dataadapter对象、Datareader对象以及Dataset对象。ADO.NET架构图参见[3]。
其中Connection对象、Command对象、 DataAdapter对象和DataReader对象四个组件是负责建立联机与数据操作部分的,被称为数据提供组件 (Managed Providers)。而Dataset对象是ADO.NET非连接架构下把数据库中的数据映射到内存缓存中所构成的数据容器,是一个或多个DataTable 对象的集合。DataSet在使用时就像驻留在客户端计算机上的一个小型关系数据库,但又与任何具体的数据库完全无关。DataAdapter对象在后台数据库和前台Dataset对象之间起着桥梁作用。其Fill方法将后台数据库的数据取到前台客户端的Dataset对象中来。而其Update方法则按相反方向把前台对数据库的写操作写入数据库中去,它由应用程序在Dataset中添加、更改或删除的行对数据库进行更新,在使用DataAdapter时,需要将查出的数据起一个表名放到DataSet中。一个Dataset可以存放多个表,而TableAdapter的结果就是一个表,不能再继续添加表。
DataReader实现数据操作以及对数据的快速、只进、只读访问。Connection对象提供与数据源的连接。Command对象能够访问用于返回数据、修改数据、运行存储过程、发送或检索参数信息的数据库命令。DataReader从数据源中提供高性能的数据流。它需要与数据库保持连接,ExecuteReader()函数返回一个SqlDataReader对象或OleDbDataReader对象,通过这个对象来检查查询结果,它是一种“单向”流,一次只能提供一行数据,就像高速传送带上的一排箱子,一旦它们被放在带子上,就无法对它们排序或过滤出选定的箱子,也因此占用内存少,执行效率高。当用户读取大量数据时,可以使用DataReader来提高性能。
根据应用程序所需功能和性能的要求,来确定是使用DataSet还是DataReader。
嵌入式SQL在VB.NET环境下通过SqlCommand.ExecuteNonQuery()方法,对连接执行SQL语句,并返回受影响的行数,当行数大于0时,命令执行成功,否则说明对数据库没产生影响。通过使用SqlCommand.ExecuteScalar()方法来执行命令对象的SQL语句,从数据库中检索单个值,当值大于0时,命令执行成功,否则命令执行失败。该方法不接受任何参数,仅仅返回查询结果集中的第一行第一列。
在VB.NET环境下通过调用以上定义的函数,就可以实现使用各种嵌入式SQL语句来操纵后台数据库的功能。
(三)C#语言环境下的设计实现
由于C#简单易学,而且可以跨平台使用,因此它正在成为程序开发人员使用的主流编程语言。[4] 它具有如下诸多优点:
C#遵守通用语言规范(common language specification,CLS)。
C#具备自动内存管理功能:CLR 内建垃圾收集器,当变量实例的生命周期结束时,垃圾收集器负责收回不被使用的实例占用的内存空间。
C#具有交叉语言处理能力:由于任何遵守通用语言规范的程序设计语言源程序,都可编译为相同的中间语言代码,不同语言设计的组件,可以互相通用,可以从其他语言定义的类派生出语言的新类。
C#更加安全:C#语言不支持指针,一切对内存的访问都必须通过对象的引用变量来实现,只允许访问内存中允许访问的部分,这就防止病毒程序使用非法指针访问私有成员,也避免指针的误操作产生的错误。
C#软件的安装更加容易:在.NET 中这些组件或动态连接库不必在注册表中注册,每个程序都可以使用自带的组件或动态连接库,使软件的安装更加容易。
C#是完全面向对象的:C#语言中所有的函数、变量和常量都必须定义在类中,避免了命名冲突。C#语言不支持多重继承。
在开发项目中以类的形式来组织、封装一些常用的方法和事件,不仅可以提高代码的重用率,也大大方便了代码的管理。
本系统中using System.Data.SqlClient命名空间包含有关专门操作SqlServer数据库的类,如SqlConnection,SqlCommand,SqlDateAdapter等,System.Data命名空间包含数据库操作所需要用到的普通数据,如数据表,数据行等;DbHelperSQL类定义了与数据库的连接配置、执行SQL语句的公用方法等。调用并且构建这些类的实例设计完成系统主窗体和系统的增、删、改、查询功能。
七、结论
(一)在不同高级语言环境下创建应用程序的过程都一样。
(二)在不同环境下使用的SQL语句都完全一样,可以实现同样的数据库操纵功能。
(三)在VB6.0环境下编写的应用程序,搬到.NET环境下不能使用。
(四)NET开发平台具有更加强大的内部函数库,.NET编程很大程度上依靠程序库中提供的可重用源代码,.NET框架提供了2500多个可重用的类。公共语言运行时库(CLR)提供了执行程序的服务,实现了编程语言的统一。.NET程序需要经过两次编译才能在CPU上运行,首先编译生成与CPU无关的中间语言(MSIL)程序,在CLR的支持下,中间语言程序被编译成由本地CPU指令组成的程序,实现了.NET跨平台运行的目标。[5]
(五)NET采用ADO.NET数据访问技术,支持离线的数据访问功能,同时提供了只进的、一次只能读取一条记录的消耗资源极小的DataReader对象,提高了应用程序对数据库访问的性能。更适用于分布式数据库应用系统的应用。
(六)VB.NET和C#生成的代码可以完全通用。VB提供了很多类型转换函数型运算符,如CInt(), CSng(), CStr()等,在C#中只要用(int) , (float), (String)即可; VB支持两种形式的异常,即.net框架的异常和VB自己的错误号码,而C#只支持第一种。用到VB自己的错误号码的程序几乎无法移植到C#中。
(七)VB支持模块,C#不支持。在C#中制造一个abstract类,共享所有成员,就和模块一样了。C#不能像VB一样直接访问模块中的成员,需要使用“类名.成员名”的用法。
(八)C#代码更加简洁,像VB.NET一样简单,像C++一样强大, 是第一流的面向组件的语言。C#语言是.NETFrame Work 中新一代的开发工具,是一种现代的、面向对象的语言,它简化了C++语言在类、命名空间、方法重载和异常处理等方面的操作,摒弃了 C++的复杂性,更易使用,更少出错。它使用组件编程,和VB一样容易使用。C#语法和 C++、JAVA 语法非常相似。所有的.NET Framework中的基类库(Base Class Library)都由C# 编写。
参考文献:
[1]刘世峰.数据库应用技术(本科)[M].中央广播电视大学出版社,2008,103
[2]顾晓梅.数据库应用技术教程[M],上海电视大学教材, 2010, 171
[3]吕军.软件项目综合实训(.NET篇)[M],清华大学出版社,2010,96~97
[4]明日科技 王小科,王军,赵会东.C#项目开发案例全程实录(第2版)[M],清华大学出版社,2011,前言
[5]龚沛曾.Visual Basic.NET程序设计教程(第2版)[M],高等教育出版社,2005,17