机房收费系统第二版加了设计模式和SqlHelper还有一些数据的操作,基本上已经完工了,和第一版简单三层机房收费系统相比感觉上并没有简单多少,反而相互之间调来调去,感觉麻烦,但是从可维护性上,可扩展性去想,还是非常有优势的。例如抽象工厂就解决了换数据库的麻烦;外观模式,就解决了扩展方便的麻烦;SqlHelper,使D层的书写更为简单,重复工作大大降低;而数据库操作的存储过程,触发器,视图,又使代码逻辑变得更为简单。这篇博客中重点介绍一下其中的数据库操作。
一,存储过程(Stored Procedure)
1,概念:存储过程是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
2,优点:执行速度快,模块化程序设计,减少网络通讯量,保证系统的安全性,实现代码的重复利用。更多学习看标题的连接,或看百科存储过程。
3,举例使用:在机房收费系统很多功能,需要多次调用不同表的数据库操作,这样会使我们代码的逻辑结构稍显复杂,利用存储过程可以很容易解决这个问题。例如:机房收费系统的退出系统功能的操作:
假如不用存储过程:需要我们通过三层之间的传递先向工作记录表中插入这条数据,然后在删除正在上机表中的此条数据,这样就需要我们来回传递两次。
用存储过程:我们可以把插入和删除操作卸载存储过程一次调用就可以完成:
存储过程代码:
-- ============================================= -- Author: 刘佳翰 -- Create date: 2013/4/7 -- Description: 删除正在上机信息的同时,向上机记录中插入此记录 -- ============================================= ALTER PROCEDURE [dbo].[PROC_UpLogin] -- Add the parameters for the stored procedure here @computerID varchar(20),@name varchar(20),@userLevel varchar(20),@onlineDate varchar(20), @onlineTime varchar(20),@uplineDate varchar(20),@uplineTime varchar(20), @recordID varchar(20) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here delete T_OnWorkTeacher where computerID=@computerID insert into T_WorkRecord(name,userLevel,onlineTime,onlineDate,recordID,computerID,uplineDate,uplineTime) values (@name,@userLevel,@onlineTime,@onlineDate,@recordID,@computerID,@uplineDate,@uplineTime) END
调用代码:
Public Function InsertWorkRecord(ByVal WorkRecord As SC_Entity.WorkRecordEntity) As Boolean Implements SC_IDAL.IWorkRecord.InsertWorkRecord Dim sql2 As String = "select * from T_WorkRecord" '查询T_WorkRecord表中的数据条数 Dim sql As String = "PROC_UpLogin" Dim InsertSqlHelper As New SqlDBhelper Dim sqlParam(7) As SqlParameter sqlParam(0) = InsertSqlHelper.AddSqlParameter("@name", SqlDbType.VarChar, WorkRecord.GetName) sqlParam(1) = InsertSqlHelper.AddSqlParameter("@userLevel", SqlDbType.VarChar, WorkRecord.GetUserLevel) sqlParam(2) = InsertSqlHelper.AddSqlParameter("@onlineTime", SqlDbType.VarChar, WorkRecord.GetOnlineTime) sqlParam(3) = InsertSqlHelper.AddSqlParameter("onlineDate", SqlDbType.VarChar, WorkRecord.GetOnlineDate) sqlParam(4) = InsertSqlHelper.AddSqlParameter("@recordID", SqlDbType.VarChar, InsertSqlHelper.InquireDataTable(sql2, CommandType.Text).Rows.Count + 1) sqlParam(5) = InsertSqlHelper.AddSqlParameter("@computerID", SqlDbType.VarChar, WorkRecord.GetComputerID) sqlParam(6) = InsertSqlHelper.AddSqlParameter("@uplineDate", SqlDbType.VarChar, WorkRecord.GetUplineDate) sqlParam(7) = InsertSqlHelper.AddSqlParameter("@uplineTime", SqlDbType.VarChar, WorkRecord.GetUplineTime) Return InsertSqlHelper.ExecuteNoQuery(sql, CommandType.StoredProcedure, sqlParam) End Function
这样就实现了一个简单的存储过程的实现功能。
二,触发器(trigger):
1,概念:触发器是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
2,作用:主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。其次还有强化约束,跟踪变化,级联运行,存储过程的调用等。跟多学习,看标题的连接或百科触发器 。
3,慎用触发器:触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作……同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
4,举例使用:由于一般选择都是先用存储过程,触发器我只是做了个小例子实验了一下,大家看一个数据表当插入一条数据时,触动再插入一条的触发器。
触发器代码:
-- ============================================= -- Author: 刘佳翰 -- Create date: 2013/4/7 -- Description: 触发器,当插入一条数据时,再插入一条固定的数据 -- ============================================= ALTER TRIGGER [dbo].[DeleteAdd] ON [dbo].[Users] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; insert into Users (User_ID ,User_Pwd ) values ('ljh','13236') END
插入一条语句:
insert into Users (User_ID ,User_Pwd ) values ('122','121')
三,视图:
1,概念:视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
2,作用,在设计数据库中一般为了数据冗余,都会按照三范式去设计,但是在查询中我们需要通过一字段获得跟这个字段相关联的好几个字段,但是他们分布在不同的表中,这时需要我们用视图,把想要查询的字段都放在一个视图中来查询,这样就方便很多了。
3,举例使用:
通过两个表建立一个视图,如图就可以通过name字段把两个表联系起来了,也就是通过现有的两个表T_OnWorkTeacher和T_User,建立了一个临时表下图。然后再通过正常的数据操作来完成即可了。
上边是机房收费系统对数据库操作的简单总结。 总而言之,现在已经慢慢把以前学习的数据库知识慢慢的用到实践中了,通过使用,对这些已经有了初步的了解,深入的学习还需呀大量的实践。