一、存储过程的概念
存储过程是在数据库管理系统中保存的、预先编译的并能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的一种数据对象
1、为什么需要存储过程
1> 防止SQL注入式攻击
2> 应用程序执行的过程是不安全的,主要问题:
>数据不安全
>每次提交SQL代码都要经语法编译后再执行,影响应用程序的运行性能
>网络流量大
2、什么是存储过程
1> 概述:
>存储过程(Procedure)类似于C#中的方法,它是SQL语句和控制语句的预编译集合。存储过程保存在数据库里,可由应用程序通过一个调用(CommandType.StoredProcedure)
执行,而且允许用户声明变量,逻辑控制语句以及其他强大的编程功能
>存储过程返回单个或多个结果集以及返回值
2> 使用存储过程的优点
>模块化程序设计
>执行速度快,效率高
>减少网络流量
>具有良好的安全性
二、系统存储过程
1、常用的系统存储过程
>exec sp_databases --当前系统中的数据库
>exec sp_renamedb 'MySchool','MySh' --改变数据库名称(单用户访问)
use MySchool
go
>exec sp_tables --当前数据库可以查询对象的列表
>exec sp_columns Student --查看表student中列的信息
>exec sp_help student --查看表student的所有信息
>exec sp_helpconstraint student --查看表student的约束
>exec sp_helptext 'view_Student_Result' --查看视图的语句文本
>exec sp_stored_procedures --返回当前数据库中的存储过程列表
2、常用的扩展存储过程
缺省?
三、用户定义的存储过程
1、创建带参数的存储过程
1> 语法
>创建存储过程
create proc 存储过程名
@参数1数据类型 [=默认值][output]
.......,
@参数n数据类型 [=默认值][output]
as
SQL语句
>删除存储过程
drop proc 存储过程名
>执行存储过程
exec 存储过程名参数值1.....,参数n
2> 检测存储过程是否存在
if exists(select * from sysobjects where name=存储过程名)
drop proc 存储过程名
go
3> 实例:
create proc sys_login
@loginId varchar(20),
@loginPwd varchar(20)
as
select loginId,LoginPwd from Admin
where LoginId=@loginId and LoginPwd=@loginPwd
4> 应用程序调用存储过程
SqlConnection conn = new SqlConnection("server=.;database=MySchool;integrated security=SSPI");
//放入存储过程名
SqlCommand cmd = new SqlCommand("sys_login",conn);
//存储过程必须把CommandType设置为存储过程,不能是默认Text类型
cmd.CommandType = CommandType.StoredProcedure;
//对应每个参数进行赋值
cmd.Parameters.AddRange(new SqlParameter[] {
new SqlParameter("@loginId",textBox1.Text),
new SqlParameter("@loginPwd",textBox2.Text)});
conn.Open();
SqlDataReader read = cmd.ExecuteReader();
bool hasrow = false;
if (read.HasRows)
hasrow = true;
conn.Close();
if (hasrow)
MessageBox.Show("登陆成功!");
else
MessageBox.Show("登陆失败!");
2、创建带输出参数的存储过程
1> 如果存储过程的参数后面有“output”关键字,则表示此参数为输出参数
2> 实例:
create proc sys_login
@num int output, --输出参数
@loginId varchar(20),
@loginPwd varchar(20)
as
select loginId,LoginPwd from Admin
select @num=count(*) from Admin
四、处理异常信息
1、raiserror语句
>对正常的程序逻辑强制生成错误,并停止过程的执行,类似于.net的throw异常
>抛出异常是传递信息的一种方式
>SQL中
create proc getAge
@age int = 15
as
begin
if @age<18
raiserror('未成年不能购买寂寞,除非被潜?',6,1)
end
> .net中
if(t!="w")
{
throw new Exception("错误啦!");
}
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ----------------------