2013-08-30 42 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