2012-01-17 152 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