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

标签 c# sql stored-procedures

我有以下带有一个输入参数和一个输出参数的 SQL 存储过程。

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

在上述存储过程中,tblUsers 中的 CanUserEdit 列是位类型列,默认值为 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;
        }
    }
}

最佳答案

问题在于您返回数据的方式。如果你想使用 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”。

关于c# - Command.ExecuteScalar 始终返回 null,而 Management Studio 中的存储过程运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529956/

相关文章:

php - 优化此 SQL 查询

sql - 计算 postgresql 矩阵中列的组合

c# - 将 Gridview LinkBut​​ton ID 传递给 ASP.NET 中的模式弹出窗口

c# - 有效地将项目添加到列表<类>中并行 C#

c# - 异步方法中的信号量等待与 WaitAsync

MySql-如何给单列设置两个别名

sql-server - 使用存储过程中的表名称填充数据集

database - 游标与重复代码/逻辑

php - 使用 mysql 存储函数和选择查询

c# - PreviewExecuted 后未调用 Executed