Сохраненная процедура возвращает значения с контекстом данных 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