1

我有一个标量函数,它在 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
4

2 回答 2

1

您将需要更改从 C#调用SQL 函数的方式。

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

  2. 您不能仅通过名称调用 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());
     }
    
于 2019-07-10T06:22:14.267 回答
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)的技术。

于 2019-07-24T06:26:22.807 回答