【问题标题】:Command.ExecuteScalar always return null while Stored Procedure in Management Studio runs fine当 Management Studio 中的存储过程运行良好时,Command.ExecuteScalar 始终返回 null
【发布时间】:2013-09-03 00:13:03
【问题描述】:

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

亲切的问候

【问题讨论】:

    标签: c# sql stored-procedures


    【解决方案1】:

    问题在于您返回数据的方式。如果你想使用 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?
    • 很高兴为您提供帮助 :) 我已经编辑了我的答案,以在代码中而不是 SP 中包含可能的修复。
    【解决方案2】:

    使用缩放函数而不是存储过程。 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 1970-01-01
      • 2023-03-20
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2014-08-04
      • 1970-01-01
      相关资源
      最近更新 更多