5

我有以下带有一个输入参数和一个输出参数的 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

在上面的存储过程中,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;
        }
    }
}

亲切的问候

4

2 回答 2

14

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

于 2013-08-30T10:04:06.733 回答
0

使用缩放函数而不是存储过程。SQL 函数更容易设置,它们默认返回一个缩放器值,因此不需要“输出”或返回变量声明。例子:

CREATE FUNCTION [dbo].[ScalerFnExample]()
RETURNS VARCHAR(50)
AS
   BEGIN
      RETURN (SELECT TOP 1 Thing FROM Examples.dbo.Stuff)
   END

C# 示例:

    public string SqlScalerFnExample()
    {
        string retVal = default;

        try
        {
            using (SqlConnection sqlConnection = new SqlConnection("Server=127.0.0.1;Database=Examples;Trusted_Connection=True;"))
            {
                SqlCommand userFn = new SqlCommand("SELECT dbo.ScalerFnExample()", sqlConnection);

                sqlConnection.Open();

                retVal = (string)userFn.ExecuteScalar();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"SqlScalerFnExample() - Exception: {ex.Message}");
        }

        return retVal;
    }
于 2021-02-05T23:37:11.147 回答