У меня есть скалярная функция в базе данных SQL Server, которую я хочу вызвать с использованием ADO.NET, но она всегда возвращает ноль - PullRequest
1 голос
/ 10 июля 2019

У меня есть скалярная функция, которая возвращает одно значение в SQL Server.Я пытаюсь получить это значение, вызывая ExecuteScalar, но он всегда возвращает NULL, а C # выдает NullReferenceException.

Я создал функцию, которая проверяет доступность комнаты;если комната доступна, она должна вернуть 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 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

Ожидаемый результат:

  • , если доступно помещение, вернуть номер комнаты
  • остальное вернуть 0

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Вам необходимо изменить способ вызова функции SQL из C #.

  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());
     }
    
0 голосов
/ 24 июля 2019

Для скалярного 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;

Или, в качестве альтернативы, используйте технику, используя CommandType.Text (CommandType по умолчанию), как описано в ответе Бхарати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...