存储过程返回带有linq数据上下文的值

本文关键字:上下文 数据 linq 返回 存储过程 | 更新日期: 2023-09-27 18:09:42

我正在尝试使用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

这在通过sql studio运行SP时有效。然而,我尝试使用datacontext类用linq运行它,它总是返回-1。

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

查询总是等于-1,我不知道为什么。

我在网上看了看,似乎有更容易的方法来获得返回值,但我宁愿坚持使用Linq,因为这是程序的其他部分正在使用的。

存储过程返回带有linq数据上下文的值

为什么都使用存储过程作为函数?

虽然存储过程有return,但它不是一个函数,所以不应该使用return返回数据,

相反,您应该使用Output参数和其他方式来返回数据,如MSDN 中所述

return的使用记录在MSDN 中

误用return可能是LINQ不理解您的存储过程的原因。

我就是这么做的,而且很管用。

在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 =@Id+1;
select @Ret
END

在C#中:

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

试试看:(

尝试将RETURN 0/1语句更改为SELECT 0/1

代码的问题是使用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);               
}

如果这不起作用,那就去其他解决方案

  • 输出参数
  • 使用标量值函数

这里讨论的是:LINQ到SQL:从存储过程返回标量值

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