Command.ExecuteScalar始终返回null,而Management Studio中的存储过程运行正常

Lea*_*rve 4 c# sql stored-procedures

我有以下SQL存储过程,其中包含一个输入参数和一个out参数.

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
Run Code Online (Sandbox Code Playgroud)

在上面的存储过程中,CanUserEdittblUsers是位类型列,默认值为0.现在,当我在Management Studio中执行此过程时,它运行正常,但是当我command.ExecuteScalar()在我的C#代码中使用时,它总是返回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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

亲切的问候

Dan*_*Dan 13

问题在于您返回数据的方式.如果你想使用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
Run Code Online (Sandbox Code Playgroud)

如果您无法更改SP,但代码,解决方案是使用ExecuteNonQuery读取参数'@ReturnValue'.