一、创建数据表
下图为表 custom 结构
下图为表 department 结构(id为外键,作为表custom中列 departID的参考列)
二、创建增删查改的存储过程(详细说明)
(1)创建增加数据的存储过程
Create Procedure Addcustom
--全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
--接收存入表中的数据
@cname nvarchar(50),
@departid int,
@age int,
@ename nvarchar(50),
@password nvarchar(50)
--此处 as 不可以省略不写,指定过程要执行的操作
as
--begin 和 end 是一对,不可以只写其中一个,但可以都不写
--表示复合语句的开始,结束
begin
--执行SQL语句
insert into custom
values
(@cname,@departid,@age,@ename,@password)
end
(2)创建删除数据的存储过程
Create Procedure Delcustom
@id int
as
begin
delete from custom
where id=@id
end
(3)创建查询数据的存储过程
Create Procedure Checkcustom
--全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
--接收存入表中的数据
@cname nvarchar(50),
@departname nvarchar(50),
@age int,
@ename nvarchar(50),
@password nvarchar(50)
--此处 as 不可以省略不写,指定过程要执行的操作
as
--begin 和 end 是一对,不可以只写其中一个,但可以都不写
--表示复合语句的开始,结束
begin
--设置局部变量存储查询语句
--局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
--局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}
--局部变量的显示:select @变量名
declare @sql varchar(MAX)
declare @departid int
set @sql='select * from custom where 1=1'
--根据department中的departname来查询id值并赋给departid
if(@departname !=' ')
set @departid=(select id from department where departname=@departname)
--执行SQL语句
if(@cname !=' ')
--在连接数据库查询语句时,由于与字符串比较时需要加上双引号或单引号,因此需要在变量前后加上'''',否则会出错
--在判断是否为空值时,在sql 中的判断语句为 is not null 但由于在调用过程中无法传null值进来,当空值时赋值' '并判断是否为' '
set @sql = @sql + ' and cname = '+ ''''+ @cname+ ''''
if(@ename !=' ')
set @sql = @sql + ' and ename = '+ '''' + @ename+ ''''
if(@password !=' ')
set @sql = @sql + ' and password = '+ '''' + @password+ ''''
if(@age > 0)
--由于原本类型为int类型不能与字符串进行连接,因此需要使用cast(@age as varchar(10))进行类型转换
set @sql = @sql + ' and age = ' + cast(@age as varchar(10))
if(@departid>0)
set @sql = @sql + ' and departId = ' + cast(@departid as varchar(10))
--执行并返回查询语句的结果
exec(@sql);
end
Create Procedure Altercustom
--全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
--接收存入表中的数据
@id int,
@cname nvarchar(50),
@departid int,
@age int,
@ename nvarchar(50),
@password nvarchar(50)
--此处 as 不可以省略不写,指定过程要执行的操作
as
--begin 和 end 是一对,不可以只写其中一个,但可以都不写
--表示复合语句的开始,结束
begin
--执行SQL语句
update custom
set cname=@cname,departID=@departid,age=@age,ename=@ename,password=@password
where id=@id
end
三、调用存储过程
本次调用在VS2015 网页后台中调用
(1)引用连接操作数据库头文件
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
(2)调用增加数据存储过程
//创建连接对象conn
SqlConnection conn = new SqlConnection();
//设置连接sql字段(参数为:连接的服务器名 .为本地服务器;连接数据库名;用户名;密码)
conn.ConnectionString = " Data Source =.; Initial Catalog = web; User ID = Jce; Password = 569931614";
//创建调用数据库指令调用存储过程参数为调用的(存储过程名称,连接对象)
SqlCommand cmd = new SqlCommand("Addcustom", conn);
//将指令类型设置为存储过程
cmd.CommandType = CommandType.StoredProcedure;
//设置输入到存储过程的参数(但不能为null,当为null时认为无参数,自定义参数,空值时为"")
string cname,id,ename,password;
int age;
//多值调用
//数据库指令cmd.Parameters中存放参数,只用Add添加多个参数
//SqlDbType设置相应的参数类型
//添加类型后使用.Value属性设置相应的参数值
cmd.Parameters.Add("@cname", SqlDbType.NChar).Value =cname;
cmd.Parameters.Add("@departid", SqlDbType.Int).Value = id;
cmd.Parameters.Add("@ename", SqlDbType.NChar).Value = ename;
cmd.Parameters.Add("@password", SqlDbType.NChar).Value = password;
cmd.Parameters.Add("@age", SqlDbType.Int).Value = age;
//当将参数输入后执行过程
cmd.ExecuteNonQuery();
(3)调用删除存储过程
SqlConnection conn = new SqlConnection();
conn.ConnectionString = " Data Source =.; Initial Catalog = web; User ID = Jce; Password = 569931614";
//创建调用数据库指令调用存储过程参数为调用的(存储过程名称,连接对象)
cmd = new SqlCommand("Delcustom", conn);
int id;
//将指令类型设置为存储过程
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
cmd.ExecuteNonQuery();
(4)调用查询存储过程
//创建连接对象conn
SqlConnection conn = new SqlConnection();
//设置连接sql字段(参数为:连接的服务器名 .为本地服务器;连接数据库名;用户名;密码)
conn.ConnectionString = " Data Source =.; Initial Catalog = web; User ID = Jce; Password = 569931614";
//创建调用数据库指令调用存储过程
SqlCommand cmd = new SqlCommand("Checkcustom", conn);
//将指令类型设置为存储过程
cmd.CommandType = CommandType.StoredProcedure;
string cname,departID,ename,password;
int age;
//将值传入存储过程的参数过程中,如果为判断是否为空时传入null时则认为无参数出错,传入""时在存储过程中无法判断,因此在存储过程中判断是否为" "
//在判断条件输入框是否为空值时,判断是否="",而不判断是否=null
if (cname == "")
cmd.Parameters.Add("@cname", SqlDbType.NChar).Value = " ";
else
cmd.Parameters.Add("@cname", SqlDbType.NChar).Value = cname;
if(ename()=="")
cmd.Parameters.Add("@ename", SqlDbType.NChar).Value = " ";
else
cmd.Parameters.Add("@ename", SqlDbType.NChar).Value = ename;
if(password=="")
cmd.Parameters.Add("@password", SqlDbType.NChar).Value = " ";
else
cmd.Parameters.Add("@password", SqlDbType.NChar).Value = password;
if(departID=="")
cmd.Parameters.Add("@password", SqlDbType.NChar).Value = " ";
else
cmd.Parameters.Add("@departname", SqlDbType.NChar).Value = departID;
cmd.Parameters.Add("@age", SqlDbType.Int).Value = age;cmd.ExecuteNonQuery();
SqlDataAdapter dr = new SqlDataAdapter();
dr.SelectCommand = cmd;DataSet ds = new DataSet();
//创建数据集;dr.Fill(ds);
//填充数据集
this.GridView1.DataSource = ds;GridView1.DataBind();
//将数据源绑定到控件上
(5)调用修改数据存储过程
//创建连接对象conn
SqlConnection conn = new SqlConnection();
//设置连接sql字段(参数为:连接的服务器名 .为本地服务器;连接数据库名;用户名;密码)
conn.ConnectionString = " Data Source =.; Initial Catalog = web; User ID = Jce; Password = 569931614";
//创建调用数据库指令调用存储过程
SqlCommand cmd = new SqlCommand("Altercustom", conn);
//将指令类型设置为存储过程
cmd.CommandType = CommandType.StoredProcedure;
//多值调用
//数据库指令cmd.Parameters中存放参数,只用Add添加多个参数
//SqlDbType.NChar设置相应的参数类型
//添加类型后使用.Value属性设置相应的参数值
string cname,departID,ename,password;
int age,id;
cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
cmd.Parameters.Add("@cname", SqlDbType.NChar).Value = cname;
cmd.Parameters.Add("@departid", SqlDbType.Int).Value = departID;
cmd.Parameters.Add("@ename", SqlDbType.NChar).Value = ename;
cmd.Parameters.Add("@password", SqlDbType.NChar).Value = password;
cmd.Parameters.Add("@age", SqlDbType.Int).Value = age;cmd.ExecuteNonQuery();
在上述代码中连接数据库的部分是重复的,因此对其进行封装简化代码
空字符串和null的区别
空字符串:已经分配了存储空间但没有存储内容
null:没有分配存储空间