这次主要是讲ADO.NET访问存储过程的知识,所以,在开篇的时候还是把SQL Server存储过程的知识给串讲,复习一下。
对于前段程序开发人员来说,存储过程是很重要的工具,他可以使开发者在不了解表架构的情况下使用存储过程对数据进行处理。同时,由于存储过程具有封装的概念,当逻辑规则改变时,可以在不影响前端程序设计的情况下对后端程序进行修改。
存储过程包括视图的所有的优点,视图只有select命令,而存储过程则包含了几乎所有的T-Sql命令。存储过程可以很大的提高T-SQl命令的执行效率。
T-Sql语句在SQl Server 客户端执行的过程:
每次执行时都需要分析语句正确与否,优化与编译成执行计划,再对照SQl Server中是否有相同的执行计划。
一般的T-SQl命令重复执行时,会一直执行同样的分析,最优化,编译的工作,将耗费大量的CPU时间。
而是用存储过程则是只进行一次分析,优化,编译的过程,之后就直接依照SqlServer缓存中的执行计划直接执行。
优点:减少网络带宽的占用:因为存储过程是在SqlServer端执行,不需要和前端进行来回的沟通,相比之下就减少了在网络上传递包的带宽占用量,对于网络程序执行来说,使用存储过程能够减少对网络带宽的占用。
SqlServer存储过程的声明方式:
Create proc存储过程名称
As
T-sql命令
SqlServer存储过程分为无参数存储过程和有参数存储过程
1)没有参数的存储过程
调用存储过程
Exec 存储过程名称;
这样的用法和视图差不多,但是视图不可以使用order by命令。而存储过程没有这样的限制。
示例1-1代码如下:
--创建不带参数的存储过程
create proc select_activity
as
--该存储过程所执行的sql命令
select * from T_Activity;
SQL调用该存储过程
--调用select_activity存储过程
exec select_activity
有参数的存储过程
主要有三种类型的参数:
1)输入参数2)输出参数3)返回值
输入参数即在调用这个存储过程之前必须输入参数而该参数仅在程序中使用,并不会再返回给用户
基本的声明方式:
Create proc 存储过程名称
@输入参数名称1 数据类型,
@输入参数名称2 数据类型
As
T-sql命令
如果存在多个参数,就需要在各个输入参数间以逗号分隔 。如果参数是字符串或者日期,则需要用单引号括起来,而数字则不用。
备注:
存储过程通常不要编写太长,因为存储过程是在数据库端执行的,太长的话会影响执行效率;
示例1-2代码如下:
--创建带参数的存储过程
create proc select_activity1
--修改存储过程的语句
--alter proc select_activity1
--声明参数,多个参数有“,”号分隔符隔开,参数后面声明该参数的数据类型
@id int,
@activityName nvarchar(50)
as
--该存储过程所执行的Sql命令
select * from T_Activity where id=@id and activityName=@activityName;
--调用带参数的存储过程
--如果参数是字符串或者日期,则需要用单引号括起来,而数字则不用。
exec select_activity1 5,'比武招亲'
--或者
exec select_activity1
@id=1,
@activityName='比武招新';
存储过程中可以包含一些简单的编程语句
比如:if ,begin ·····end····等语句
示例1-3代码如下:
--在设置参数时,如果需要给设置的参数赋值,则在声明的参数后面加“=”后面跟所设置的初始值,这里设置的初始值为空
create proc sele_activity
@id int=null,
@activityInfoId int=null
as
--使用的if语句来判断输入的参数值是否为空,如果为空则返回前端错误信息“请输入参数”,而且使用return立刻结束该存储过程
if @id is null or @activityInfoId is null
begin
raiserror('请输入参数',16,1)
return
end
--执行的sql命令
select * from T_Activity where id=@id or activityInfoId=@activityInfoId;
--使用了没有给参数赋值的存储过程,返回错误
--错误信息:“消息 50000,级别 16,状态 1,过程 sele_activity,第 7 行 请输入参数”
exec sele_activity;
--这样调用返回正确的结果
exec sele_activity
@id=2,
@activityInfoId=8;
输出参数的存储过程
输出参数和输入参数刚好相反,输入参数只会在as一下活动,而输出参数则返回前端使用
输出参数的声明过程:
Createproc存储过程名称
@输入参数名称 数据类型
@输出参数名称 数据类型 output
As
T-Sql命令
在声明输出参数变量时,必须声明为output,存储过程执行完成以后会将输出参数返回前端
示例1-4代码如下:--创建select_MathResult的存储过程
create proc select_MathResult
--声明输出参数@activityName和参数的类型
@activityName nvarchar(50),
--声明输出参数,并使用output来表明该参数为输出参数
@result int output
as
--使用T-SQL语句来返回相同activityName的数据行数
select @result=count(*) from T_Activity where activityName=@activityName
--调用存储过程,调用时先声明接受输出参数的参数@answer和该参数的类型
declare @answer int
exec select_MathResult '比武招亲' ,@answer output
select '结果是',@answer