我在 SQL 服务器数据库中有一个标量函数,我想使用 ADO.NET 调用它,但它总是 returns null

I have a scalar function in a SQL Server database which I want to to call using ADO.NET but it always returns null

我有一个标量函数,它 return 在 SQL 服务器中有一个值。我试图通过调用 ExecuteScalar 来获取该值,但它总是 returns NULL 并且 C# 抛出 NullReferenceException.

我创建了一个检查房间可用性的功能;如果房间可用,它应该 return roomId,否则 0.

我在 C# 中使用 ADO.NET 调用该函数,但在这种情况下,它会引发异常。

ADO.NET代码:

using (SqlConnection con = new SqlConnection(connectionString))
{
    var command = con.CreateCommand();
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "RoomAvailability";

    con.Open();

    int returnValue = (int)command.ExecuteScalar();

    // The error happens on this line
    Console.WriteLine(returnValue.ToString());
}

SQL 服务器标量函数:

ALTER FUNCTION RoomAvailability()
RETURNS INT
AS
BEGIN
    DECLARE @availability INT

    IF EXISTS(SELECT TOP 1 Id FROM Romm_Details WHERE status = 'F')
    BEGIN
        SET @availability = (SELECT TOP 1 Id FROM Romm_Details WHERE status = 'F')
    END
    ELSE
    BEGIN
        SET @availability = 0
    END

    RETURN @availability    //RETURN NULL VALUE 
END

预期结果:

您需要更改从 C# 调用 SQL Function 的方式。

  1. 删除 command.CommandType = CommandType.StoredProcedure; - 您调用的是函数而不是存储过程

  2. 您不能仅通过其 name 调用 SQL 函数(如存储过程),您需要将其用作内联查询

      using (SqlConnection con = new SqlConnection(connectionString))
     {
         var command = new SqlCommand("SELECT dbo.RoomAvailability()", con);
         con.Open();
         int returnValue = (int)command.ExecuteScalar();
    
         Console.WriteLine(returnValue.ToString());
     }
    

对于标量udf,可以使用CommandType.StoredProcedure,但需要添加一个ReturnValue参数来获取结果。例如:

        var command = con.CreateCommand();
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "RoomAvailability";

        con.Open();

        SqlParameter p = new SqlParameter("@res", SqlDbType.Int);
        p.Direction = ParameterDirection.ReturnValue;
        command.Parameters.Add(p);

        command.ExecuteNonQuery();

        int returnValue = (int)p.Value;

或者,使用 Bharathi 的回答中描述的 CommandType.Text(默认 CommandType)技术。