一、存储过程
存储过程在SQL的世界中扮演着一个举足轻重的角色,所谓存储过程,就是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过存储过程的名字并给出参数来执行它。
以前学习数据库的知识都是纯理论的东西,并没有对存储过程和视图有太深刻的理解,但是通过这次的机房重构使用了存储过程和视图,挺简单的。之前写过一篇博客是对存储过程的一个总结:
http://blog.csdn.net/liutengteng130/article/details/7740296
下面来说说具体的应用:
机房收费系统中有一个注册卡号的,此时我不仅要往卡表中写信息,还要往学生信息表中写信息,充值表中还要写信息,需要往三个表中写信息,而且代码大多都是相同的内容,如果有主外键的话,肯定要按照主外键的顺序往表中写信息,否则肯定会出现很多让人头疼的问题。但是用上存储过程就会一下都会把三个表中的信息添加上,系统运行效率高,速度快,还不容易出现问题,大大节省了我们的工作效率。
代码:
USE [Charge_System]
GO
/****** Object: StoredProcedure [dbo].[PROC_RegisterBLL] Script Date: 03/14/2013 10:04:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure[dbo].[PROC_RegisterBLL]
--参数
@studentID varchar(10),@studentName varchar(10),@sex varchar(10),@department varchar(10),
@grade varchar(10),@studentClass varchar(10),@studentType char(10),@cardNo varchar(10),
@cardCash numeric(18,1),@handlers varchar(10),@state varchar(10),@isCheck varchar(10),
@cardDate varchar(10),@cardTime varchar(10),
@reCharge numeric(18,1),@rechargeDate varchar(10),@rechargeTime varchar(10)
as
insert into T_Student(studentID,studentName ,sex,department ,grade,studentClass ,studentType )values(@studentID,@studentName ,@sex,@department ,@grade,@studentClass ,@studentType )
insert into T_Card (studentID,cardNo,cardCash,handlers,state,isCheck ,cardDate,cardTime ) values (@studentID,@cardNo,@cardCash,@handlers,@state,@isCheck ,@cardDate,@cardTime)
insert into T_Recharge (cardNo,reCharge ,handlers,isCheck ,rechargeDate,rechargeTime ) values(@cardNo,@reCharge ,@handlers ,@isCheck,@rechargeDate ,@rechargeTime )
''' <summary>
''' 注册卡信息
''' </summary>
''' <param name="enCard">实体类</param>
''' <returns>返回Boolean类型,是否添加成功</returns>
''' <remarks>用存储过程注册,把卡表,学生信息表,充值表都写进去了</remarks>
Public Function AddCard(enCard As CardEntity, enStudent As StudentEntity, enRecharge As RechargeEntity) As Boolean Implements ICard.AddCard
Dim strSQL As String 'Sql字符串
'参数集合
Dim param As SqlParameter()
param = New SqlParameter() {
New SqlParameter("@studentID", enCard.studentID),
New SqlParameter("@cardNo", enCard.cardNo),
New SqlParameter("@cardCash", enCard.cardCash),
New SqlParameter("@handlers", enCard.handlers),
New SqlParameter("@state", enCard.state),
New SqlParameter("@isCheck", enCard.isCheck),
New SqlParameter("@cardDate", enCard.cardDate),
New SqlParameter("@cardTime", enCard.cardTime),
New SqlParameter("@studentName", enStudent.studentName),
New SqlParameter("@sex", enStudent.sex),
New SqlParameter("@department", enStudent.department),
New SqlParameter("@grade", enStudent.grade),
New SqlParameter("@studentClass", enStudent.studentClass),
New SqlParameter("@studentType", enStudent.studentType),
New SqlParameter("@reCharge", enRecharge.reCharge),
New SqlParameter("@rechargeDate", enRecharge.rechargeDate),
New SqlParameter("@rechargeTime", enRecharge.rechargeTime)
}
'增加数据语句
strSQL = "PROC_RegisterBLL"
'用Sqlhelper类
Return SqlHelper.DBSqlhelper.ExccuteNoQuery(strSQL, CommandType.StoredProcedure, param)
End Function
这样就可以把参数传到存储过程中。
存储过程的优点:存储过程是模块化的,从维护的角度来说是一件好事。
存储过程是可调的,还可以进行修改。
存储过程抽象或者隔离了客户端与服务器端的函数。
二、视图
视图是一个虚拟表,其内容由查询定义.与真实的表一样,视图包含一系列带有名称的列和行数据.行和列在引用视图时动态生成.视图类似于筛选.
SELECT dbo.T_Student.*, dbo.T_Card.cardNo, dbo.T_Card.cardCash, dbo.T_Card.state
FROM dbo.T_Card INNER JOIN
dbo.T_Student ON dbo.T_Card.studentID = dbo.T_Student.studentID
使用视图的好处:
视图隐藏了底层的表结构,简化了数据访问操作,大大加强了安全性,用户只能看到视图提供的数据
方便权限管理,让用户对视图有权限而不是对底层表有权限进一步加强了安全性.
视图提供了一个用户访问的接口,当底层表改变后,改变视图的语句来进行适应,是已经建立在这个视图上的客户端程序不受影响.
视图分为普通视图,索引视图,分割视图.
普通视图由Select FROM组成,并不实际存储数据.
索引视图是视图加聚集索引.索引视图会将数据物理存在数据库中,索引视图所存的数据和索引视图中所涉及的底层表保持同步.索引视图可以看做是一个和表等效的对象.
分割视图返回的数据由几个平行表进行UNION连接。将几个由不同数据源或者相同数据源获得的平行数据集进行连接所获得的。
视图还可以放在存储过程中使用,总之使用非常灵活。从各种不同的角度去分析问题,解决问题,找出更方便快捷的方法,学以致用。