存储过成一般都是要有返回值的,今天来复习带返回值的存储过程,在学习的过程之前,我想先说明下,我在复习的时候出现的一个低级错误,花了两个小时才找到错误的原因。如果刚接触存储过程的朋友,以后也需注意下,我出现的错误是,变量的顺序写反了,或者说是调用的时候参数传反了,错误代码
消息 8162,级别 16,状态 2,过程 pro_test,第 0 行
形参 "@id" 未声明为 OUTPUT 参数,但传递进来的实参请求输出。
首先,来创建一个表,表的结构很简单,就两个字段
create table t_user(
id int primary key identity (1,1) not null,
name varchar(20) not null
) go
创建存储过程
if exists (select * from sysobjects where name='proc_test')
drop procedure proc_test2
go
create procedure proc_test2
@name varchar(20) output --output指定为输出参数,不指定的话,默认是输入参数
@id int
as
select name ,id from where id=@id --这里无所谓,只不过查询出来看看,可以不写
select @name=name from where id=@id --这里才是真正的带输出的地方,同时也要输入参数
go
print '以上部分就是存储过的主要内容,下面我们来看看怎么输出呢'
declare @_name varchar(20) --定义一个变量接受存储过程的返回值 下面开始真正的调用
Exec proc_test2 @_name output ,@id=‘你的表里面的ID号,注意不要引号,这里是为了做说明而写的’ ----同时这里还可以写成这样 Exec proc_test@ @name output ,3 输出的时候一定要带上指定为输出参数的OUTPUT 否则抱错
print '我们把它打印出来看看'+@_name
go
OK,这里就是即带输入参数,又要输出的存储过程的HELLOWROD
ASP.NET中调用存储过程带(输入/输出)参数和返回值的一些常用的例子
http://hi.baidu.com/aqspace/blog/item/6f1d3b50771c9910367abe72.html
有些初学者在调用存储过程时容易出现一些错误,下面我就不同的返回参数而言举个用户登录常用的例子做一些简单的讨论:(由简单--->>深入)
创建数据库:(Student)
创建用户表:(Users)
use Student
go
create table Users
(
id int identity(1, 1) primary key,
name nvarchar(20) not null,
password nvarchar(20) not null
)
1.带输入参数的存储过程
create procedure proc_login
@name nvarchar(20),
@password nvarchar(20)
as
begin
select *
from Users
where name = @name and password = @password
end
go
调用带输入参数的存储过程
//连接数据库的字符串
private string connectionString = ConfigurationManager.AppSetting["connectionString"];
//数据层的登录方法
public static User Login(string name, string password) {
User user = null;
using (SqlConnection conn = new SqlConnection(connectionString)) {
SqlCommand cmd = new SqlCommand("proc_login", conn);
cmd.CommandType = CommandType.StoredProcedure; //指定调用存储过程
//指定参数
cmd.Parameters.Add("@name", SqlDbType.nvarchar, 20).Value = name;
cmd.Parameters.Add("@password", SqlDbType.nvarchar, 20).Value = password;
conn.open();
using(SqlDataReader sdr = cmd.ExecuteReader()) {
if(sdr.Read()) {
user = new User((int)sdr["id"], sdr["name"].ToString(), sdr["password"].ToString());
}
}
conn.Close();
}
return user;
}
2.带输入输出参数的存储过程
create procedure proc_login
@name nvarchar(20),
@password nvarchar(20),
@message nvarchar(50) output //用于输出用户登录的信息
as
begin
//判断用户名是否存在
if exists (select * from Users where name = @name)
begin
//判断密码是否正确
select * from Users where name = @name and password = @password
//返回的行数〉0
if @@rowcount > 0
begin
set @message = '登录成功!'
end
else
begin
set @message = '密码错误!'
end
end
else
begin
set @message = '用户名不存在!'
end
//在过程中如果有错误
if @@error <> 0
begin
set @message = '登录失败!'
end
end
go
调用带输入输出参数的存储过程
//数据层的登录方法
public static User Login(string name, string password, out string message) {
User user = null;
using (SqlConnection conn = new SqlConnection(connectionString)) {
SqlCommand cmd = new SqlCommand("proc_login", conn);
cmd.CommandType = CommandType.StoredProcedure; //指定调用存储过程
//指定参数
cmd.Parameters.Add("@name", SqlDbType.nvarchar, 20).Value = name;
cmd.Parameters.Add("@password", SqlDbType.nvarchar, 20).Value = password;
SqlParameter mes = new SqlParameter("@message", SqlDbType.nvarchar, 50);
mes.Direction = ParameterDiraction.Output;
cmd.Add(mes);
conn.open();
using(SqlDataReader sdr = cmd.ExecuteReader()) {
message = mes.Value.ToString();
if(sdr.Read()) {
user = new User((int)sdr["id"], sdr["name"].ToString(), sdr["password"].ToString());
}
}
conn.Close();
}
return user;
}
3.带返回值得存储过程
create procedure proc_login
@name nvarchar(20),
@password nvarchar(20)
as
declare @message nvarchar(50) output //用于返回用户登录的信息
begin
//判断用户名是否存在
if exists (select * from Users where name = @name)
begin
//判断密码是否正确
select * from Users where name = @name and password = @password
//返回的行数〉0
if @@rowcount > 0
begin
set @message = '登录成功!'
end
else
begin
set @message = '密码错误!'
end
end
else
begin
set @message = '用户名不存在!'
end
//在过程中如果有错误
if @@error <> 0
begin
set @message = '登录失败!'
end
return @message
end
go
调用带返回值得存储过程
//数据层的登录方法
public static User Login(string name, string password, out string message) {
User user = null;
using (SqlConnection conn = new SqlConnection(connectionString)) {
SqlCommand cmd = new SqlCommand("proc_login", conn);
cmd.CommandType = CommandType.StoredProcedure; //指定调用存储过程
//指定参数
cmd.Parameters.Add("@name", SqlDbType.nvarchar, 20).Value = name;
cmd.Parameters.Add("@password", SqlDbType.nvarchar, 20).Value = password;
SqlParameter mes = new SqlParameter("@message", SqlDbType.nvarchar, 50);
mes.Direction = ParameterDiraction.ReturnValue; //注意这里指定返回值
cmd.Add(mes);
conn.open();
using(SqlDataReader sdr = cmd.ExecuteReader()) {
message = mes.Value.ToString();
if(sdr.Read()) {
user = new User((int)sdr["id"], sdr["name"].ToString(), sdr["password"].ToString());
}
}
conn.Close();
}
return user;
}