2012-01-17 118 views
0

我在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#代码的最后一行出现以下错误:

无效的尝试时不存在数据读取。

有什么建议吗?

回答

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(); 
0

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

而且,你是不是产生一个结果,没有必要使用的ExecuteReader。只要做到:

cmd.ExecuteNonQuery(); 
0

您需要ReadSqlDataReader

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); 
+0

我在cmd.Parameters(@per任务).....错误“错误非可调用成员'System.Data.SqlClient.SqlCommand.Parameters'不能像方法一样使用” – pikk 2012-01-17 12:55:19

相关问题