【问题标题】:I have a scalar function in a SQL Server database which I want to to call using ADO.NET but it always returns null我在 SQL Server 数据库中有一个标量函数,我想使用 ADO.NET 调用它,但它总是返回 null
【发布时间】:2019-07-10 04:10:58
【问题描述】:

我有一个在 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

【问题讨论】:

标签: c# sql-server ado.net


【解决方案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());
     }
    

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多