Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有linq数据上下文的存储过程返回值_C#_Sql_Sql Server_Linq_Stored Procedures - Fatal编程技术网

C# 具有linq数据上下文的存储过程返回值

C# 具有linq数据上下文的存储过程返回值,c#,sql,sql-server,linq,stored-procedures,C#,Sql,Sql Server,Linq,Stored Procedures,我试图使用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访问存储过程的返回值

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 0/1语句以选择0/1

代码的问题是您使用了IFquery,而不是需要像使用EXISTSquery一样使用它因此,您的代码如下所示

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

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

输出参数 使用标量值函数
这里讨论的是:

这是我做的,而且很有效

在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中:


试一试:

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

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

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

使用return是一种非常简单的方法

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

CREATE PROCEDURE[dbo].[MyProc] 像 开始 声明@retint //使用IF EXISTS而不是IF 如果存在,请从测试中选择*,其中TestToken=@Token 选择@Ret=0 其他的 选择@Ret=1 返回@Ret 终止
这是您的工作吗?/或者任何其他解决方案?我已经尝试了您建议的更改,但query仍然会=-1我对linq to databases没有做太多的工作,但从查看它的情况来看,我假设DataEntities是某种生成的类。它确实是在做正确的事情,或者你可能需要再生它或者其他什么?如果这是一个愚蠢的评论,很抱歉,但这只是一个想法,赏金让你听起来像是任何想法/灵感都可能有所帮助请发布ValidateToken的实现代码。测试是一个视图吗?您的查询是否应该从TestsNo中选择Top1*,这也不起作用。我知道存储过程没有问题,因为当我在sql studio中运行sp时,它会返回正确的值。这也不起作用。这在sql中也不起作用。它总是返回0,即使出于某种原因无效。@Jamesla-我发现您需要使用IF EXISTS而不是IF的代码有问题..检查我的更新答案和存储prceudre这肯定会解决您的问题…我认为问题不在于存储过程,而在于数据实体框架,因为当存储过程从SQLManagementStudio执行,它为我提供了正确的返回值。但是在我的程序中它返回-1。我基本上在你的链接中做案例2,但它不起作用。这个链接是从2009年开始的,所以从那以后可能发生了一些变化。嗨,Sergio,谢谢,看起来虽然这样做有效,但我正在尝试从存储过程中获取sql返回代码,当您运行此链接时,存储过程实际上返回两个结果-@ret以及返回代码,然而,c块只得到@ret的值。从函数的角度来看,这是一个不错的技巧,但我真的想知道如何访问存储过程的返回代码而不必返回额外的结果集。@Jamesla您可以删除return语句。看看这里:解决方案通过使用select语句而不是返回来传递;从您的示例中,它再次返回-1。@Jamesla我将把它编辑到我电脑上的最后一个工作解决方案。是的,我尝试了编辑,但当我在sql studio manager中执行它时,它将返回一个结果和一个返回值。它返回@ret作为结果,然后返回实际返回值。我开始怀疑是否不可能通过entityframework获得返回值。
 static void Main(string[] args)
    {
        using (SergioEntities dm = new SergioEntities()) 
        {
            int? validToken = 1;

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

        }

    }