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

问题描述 投票:0回答:6

我正在尝试使用 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,因为这是程序的其余部分正在使用的。

c# sql sql-server linq stored-procedures
6个回答
5
投票

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

虽然存储过程有

return
,但它不是函数,因此您不应该使用
return
来返回数据,

相反,您应该使用输出参数和其他方式返回数据,如 MSDN 中记录的

并且

return
的使用已 记录在 MSDN

滥用

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


1
投票

这是我所做的,并且有效。

在 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();

        }

    }

尝试一下:)


0
投票

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


0
投票

您的代码的问题是您使用

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 to SQL:从存储过程返回标量值


0
投票
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

0
投票

如果您在存储过程中使用“select” 这是工作代码 -

ALTER PROCEDURE [dbo].[sp_GetData]
-- Add the parameters for the stored procedure here
@Id int
AS
BEGIN
    DECLARE @Ret INT 
    SELECT @Ret = COUNT(*) FROM Test 
    set @Ret =@Id+1;
    set @Ret1 =@Id+2; 
    select @Ret as Id, @Ret1 as Id2
END

C# 代码 -

using (DataAccessDataContext db = new DataAccessDataContext())
{
   Cls_Response rtn = new Cls_Response();
   try
   { 
     var SP_data = db.sp_GetData(....params...);
     foreach (var c in SP_data)
     {
        rtn.Id = c.Id;
        rtn.Id2 = c.Id2;
        rtn.Status = true;
        rtn.Message = "success";
    }
}
catch (Exception ex)
{
    rtn.Id = null;
    rtn.Id2 = null;
    rtn.Status = false;
    rtn.Message = ex.Message;
  }
  return rtn;
}

public class Cls_Response
{
    public bool Status { get; set; }
    public string Message { get; set; }
    public long? Id { get; set; }
    public long? Id2 { get; set; }
}

这是回复 -

{ 
    "Status": true,
    "Message": "success",
    "Id": 1,
    "Id2": 2
 }
© www.soinside.com 2019 - 2024. All rights reserved.