Сохраненная процедура возвращает значения с контекстом данных linq

Я пытаюсь получить доступ к возвращаемому значению хранимой процедуры с помощью Linq

DECLARE @ValidToken int = 0 //I have also tried using a bit instead of an int here.

IF EXISTS(SELECT 1 FROM Tests WHERE TestToken = @Token)
    select @ValidToken = 1

return @ValidToken

Это работает при запуске SP через студию sql. Однако я пытаюсь запустить его с помощью linq, используя класс datacontext, и он всегда возвращает -1.

using (DataEntities dataEntities = new DataEntities())
    {
        int query = data.ValidateToken(id);
        Response.Write(query.ToString());
    }

всегда будет равен -1, и я не уверен, почему.

Я посмотрел онлайн, и оказалось, что есть более простые способы получить возвращаемое значение, но я предпочитаю придерживаться Linq, так как это то, что использует остальная часть программы.

Ответ 1

Почему вы все используете хранимую процедуру как функцию?

Хотя хранимая процедура имеет return, она не является функцией, поэтому вы не должны использовать return для возврата данных,

Скорее, вы должны использовать выходные параметры и другие способы возврата данных, поскольку задокументировано на MSDN

И использование return задокументировано на MSDN

misusing return, вероятно, является причиной того, почему LINQ не понимает ваши хранимые процедуры.

Ответ 2

Попробуйте изменить операторы RETURN 0/1 на SELECT 0/1

Ответ 3

Проблема с вашим кодом заключается в том, что вы используете IF(query) вместо того, что вам нужно для пользователя, как IF EXISTS(query), поэтому код будет выглядеть следующим образом

CREATE PROCEDURE [dbo].[MyProc]         
AS
BEGIN
      DECLARE @Ret INT

      //use of IF EXISTS instead of IF
      IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
        SELECT @Ret =  0
      ELSE
        SELECT @Ret =  1

      RETURN @Ret
END

Ваш код может выглядеть так:

using (TestDBDataContext db = new TestDBDataContext())
{
    //For Stored Procedure with Return value (for Integer)
    //returns Int
    var q = db.MyProc();
    Console.WriteLine(q);               

}

Если это не работает, чем искать другие решения

  • Выходной параметр
  • Использование функций Scalar-Values ​​

Что обсуждаются здесь: LINQ to SQL: возврат скалярного значения из хранимой процедуры

Ответ 4

Это я и сделал, и это сработало.

В Sqlserver:

   ALTER PROCEDURE [dbo].[ValidateToken]
-- Add the parameters for the stored procedure here
@Id int
AS
BEGIN
DECLARE @Ret INT

SELECT
    @Ret = COUNT(*)
FROM Test

set @Ret [email protected]+1;

select @Ret

END

В С#:

 static void Main(string[] args)
    {
        using (SergioEntities dm = new SergioEntities()) 
        {
            int? validToken = 1;

            int? a = dm.ValidateToken(validToken).First();

        }

    }

Попробуйте:)

Ответ 5

CREATE PROCEDURE [dbo].[MyProc]         
AS
BEGIN
    DECLARE @Ret INT

    // use of IF EXISTS instead of IF
    IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
        SELECT @Ret =  0
    ELSE
        SELECT @Ret =  1

    RETURN @Ret
END