12

我正在尝试使用 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 时有效。但是我正在尝试使用 linq 使用 datacontext 类运行它,它总是返回-1。

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

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

我在网上查看过,似乎有更简单的方法来获取返回值,但是我宁愿坚持使用 Linq,因为这是程序的其余部分正在使用的。

4

5 回答 5

5

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

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

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

return并且使用记录在 MSDN

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

于 2013-05-25T14:29:52.233 回答
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();

        }

    }

试试看 :)

于 2013-05-21T16:53:40.213 回答
0

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

于 2013-04-17T11:25:51.497 回答
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:从存储过程返回标量值

于 2013-04-17T11:32:31.297 回答
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
于 2013-05-27T10:07:45.557 回答