ASP.NET调用SQL SEVER储存过程 --转自:http://blog.sina.com.cn/s/blog_6476328101015h2w.html

存储过成一般都是要有返回值的,今天来复习带返回值的存储过程,在学习的过程之前,我想先说明下,我在复习的时候出现的一个低级错误,花了两个小时才找到错误的原因。如果刚接触存储过程的朋友,以后也需注意下,我出现的错误是,变量的顺序写反了,或者说是调用的时候参数传反了,错误代码

 

消息 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值