.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