我在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#代码的最后一行得到以下错误:
没有数据时无效尝试读取。
有什么建议吗?
答案 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);