我在SQL Server数据库中有一个标量函数,我想使用ADO.NET进行调用,但它始终返回null

时间:2019-07-10 04:10:58

标签: c# sql-server ado.net

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

我创建了一个检查房间可用性的功能;如果有空房间,则应返回roomId,否则返回0

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

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 Server标量函数:

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

预期结果:

  • 如果有空房,返回房间ID
  • 否则返回0

2 个答案:

答案 0 :(得分:1)

您将需要更改从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());
     }
    

答案 1 :(得分:0)

对于标量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)的技术。