从存储过程中获取价值

时间:2012-01-17 12:42:03

标签: c# sql-server stored-procedures

我在sql server中有以下存储过程,我正在尝试使用C#获取权限值。

CREATE PROCEDURE [dbo].[GetPermission]
@userName varchar(50),
@permission int output
AS
BEGIN

select @permission = PERMISSION from USERS where UserName = @userName

END;

我的C#代码如下:

        SqlCommand cmd = new SqlCommand(
            "sp_getPermission", conn);


        cmd.CommandType = CommandType.StoredProcedure;


        cmd.Parameters.Add(
            new SqlParameter("@UserName", textBox1.Text));
        cmd.Parameters.Add(
           new SqlParameter("@permission", "none"));




        SqlDataReader rdr = null;

        rdr = cmd.ExecuteReader();
        MessageBox.Show( rdr["Permission"].ToString() );

但是我在C#代码的最后一行得到以下错误:

  

没有数据时无效尝试读取。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我们就是这样:

首先,删除输出参数@permission,然后改变你的程序:

CREATE PROCEDURE [dbo].[GetPermission]
@userName varchar(50)
AS
BEGIN

select PERMISSION from USERS where UserName = @userName

END;

要阅读权限,请使用ExecuteScalar方法:

SqlCommand cmd = new SqlCommand(
    "sp_getPermission", conn);


cmd.CommandType = CommandType.StoredProcedure;


cmd.Parameters.Add(
    new SqlParameter("@UserName", textBox1.Text));

var permission = (System.Int32)cmd.ExecuteScalar();

答案 1 :(得分:0)

您需要将SqlCommand上权限参数的ParameterDirection设置为ParameterDirection.Output

此外,由于您没有得到结果集,因此无需使用ExecuteReader。只是做:

cmd.ExecuteNonQuery();

答案 2 :(得分:0)

您需要Read SqlDataReader

rdr = cmd.ExecuteReader();
if (rdr.HasRows()){
   rdr.Read()
   MessageBox.Show( rdr["Permission"].ToString() );
   rdr.Close()
}

但是,我不认为你需要一个SqlDataReader用于这种情况。以下应该有效:

cmd.Parameters.Add(
           new SqlParameter("@permission", "none"));
cmd.Parameters["@permission"].Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();

MessageBox.Show(cmd.Parameters["@permission"].Value);