2013-08-30 71 views
4

我有以下SQL存儲過程,只有一個輸入參數和一個輸出參數。Command.ExecuteScalar總是返回null,而Management Studio中的存儲過程運行良好

CREATE PROCEDURE [dbo].[spCanUserEdit] 
(
@username nvarchar(255) 
) 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @CanEdit bit 

SELECT 
    @CanEdit = CanUserEdit 
FROM tblUsers 
WHERE username = LOWER(@username) 
RETURN SELECT @CanEdit 
END 
GO 

在上面tblUsersCanUserEdit列中的存儲過程是位型柱,並用默認值0。現在,當我執行在Management Studio此過程中運行良好,但是當我在我的C#代碼中使用command.ExecuteScalar(),它始終返回null。任何人都可以告訴我我在這裏做錯了什麼。

以下是我的C#方法

public static bool CanUserEdit(string userName) 
{ 
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[Constants.ConnectionStringName].ConnectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "spCanUserEdit"; 
      cmd.Connection = conn; 

      cmd.Parameters.Add(new SqlParameter("@username", userName)); 

      conn.Open(); 
      bool canEdit = (bool)cmd.ExecuteScalar(); 

      return canEdit; 
     } 
    } 
} 

親切的問候

回答

12

的問題是在返回數據的方式。如果你想使用ExecuteScalar,你不應該返回,而是簡單地選擇。

嘗試改變SP如下:

CREATE PROCEDURE [dbo].[spCanUserEdit] 
(
@username nvarchar(255) 
) 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @CanEdit bit 

SELECT 
    @CanEdit = CanUserEdit 
FROM tblUsers 
WHERE username = LOWER(@username) 

SELECT @CanEdit 

RETURN 0 
END 
GO 

如果你不能改變的SP,但代碼,解決的辦法是閱讀的ExecuteNonQuery參數「@ReturnValue」。

+0

非常感謝你......這讓我瘋狂了一陣子......我無法理解這個愚蠢的錯誤。順便問一下,如果我真的需要在這裏返回0嗎? –

+0

很高興幫助:)我編輯了我的答案,在代碼中包含可能的修復而不是SP。 – dna2