纸上得来终觉浅,绝知此事要躬行。

 

.NET取SqlServer存储过程返回值

SqlServer中的存储过程有两种返回参数的方式

1.   Return

2.   OutPut

第一种只能返回INT类型的数据,而第二种则可以是任意的(即Object类型)

今天学习了以第二种方式取返回值,首先看一个简单的存储过程

 

CREATE Procedure [dbo].[GetReturnValue]
@name varchar(20) OUTPUT
as
SET NOCOUNT ON

select @name = CuserName
from [dbo].[CuserInfo]
where CID = 1


SET NOCOUNT OFF

 

这个存储过程只有一个参数@name,而且也是只输出的

下面是c#代码取这个@name返回的值

 

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Book;Integrated Security=True");
SqlCommand cmd
= new SqlCommand("GetReturnValue", con);
con.Open();
cmd.CommandType
= CommandType.StoredProcedure;
SqlParameter sp
= new SqlParameter("@name", SqlDbType.VarChar, 20);
sp.Direction
= ParameterDirection.Output;
cmd.Parameters.Add(sp);
1. cmd.ExecuteNonQuery();
2. //cmd.ExecuteScalar();
3. //SqlDataReader dr= cmd.ExecuteReader();
//while (dr.Read())
//{

//}
//dr.Close();
MessageBox.Show(sp.Value.ToString());

这里面注意的一点是设置sp.Direction为ParameterDirection.Output,即设置@name为输出参数,非输入参数。

下面执行代码是我范的错,应该是这样的:

第一次我用了cmd.ExecuteReader(),然后就直接MessageBox.Show()了,没有Close(),这样是不行的。

原因:SqlDataReader提供一种从 SQL Server 数据库读取行的只进流的方式。意思就是它会读Sql Server数据库

里面的每一条数据,在这期间我们也用到了SqlConnection对象,执行SqlDataReader的时候SqlConnection为Open

状态,并且我们不能对其做什么操作,只有将SqlConnection关闭或者调用SqlDataReader的Close()方法关闭

SqlDataReader对象,才能再对SqlConnection对象进行操作。如果不打开SqlConnection对象,则SqlDataReader

对象是不能操作的,执行SqlDataReader则要求SqlConnection对象为Open状态,并且此连接可用。

当以上条件满足之后,我的@name参数返回的值也就取到了。

关于SqlDataReader参见MSDN:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldatareader(VS.80).aspx

另外:

如果存储过程是用Return返回的值,那么sp.Direction为ParameterDirection.ReturnValue

posted on 2011-01-14 22:00  JRoger  阅读(2965)  评论(0编辑  收藏  举报

导航