C# 获取c中的SQL插入输出值#

C# 获取c中的SQL插入输出值#,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,在一个SQL存储过程中,我插入一行,希望返回新行的IDENTITY INT,然后在我的C#代码中得到它 在C#中,我使用LINQ,但对如何检索该输出值感到模糊。我尝试将其作为输出参数包含在SQL proc声明中,但也无法使其正常工作(异常抱怨调用中没有提供它)。我得到的最接近的结果是走进Db.designer.cs代码,其中IExecuteResult resultReturnValue包含0(不正确),但检查包含的结果视图(result.ReturnValue Results View)确实有

在一个SQL存储过程中,我插入一行,希望返回新行的IDENTITY INT,然后在我的C#代码中得到它

在C#中,我使用LINQ,但对如何检索该输出值感到模糊。我尝试将其作为输出参数包含在SQL proc声明中,但也无法使其正常工作(异常抱怨调用中没有提供它)。我得到的最接近的结果是走进Db.designer.cs代码,其中
IExecuteResult result
ReturnValue包含0(不正确),但检查包含的结果视图(
result.ReturnValue Results View
)确实有输出的值

key = (int)(db.TheProc(val2,val3).ReturnValue);
返回为0。我需要插入中的IDENTITY INT值。

请尝试以下操作(假设使用SQL Server):

在将_proc存储过程定义到LINQ to SQL dbml后,可以执行以下操作:

        int? newKey = null;
        dataContext.the_proc("val1", "val2", ref newKey);
        // newKey.Value now contains your new IDENTITY value
基本上与执行select相同。所以这不会显示为输出参数,而是作为结果集返回

顺便说一句,ReturnValue实际上应该是零,这就是您在本例中看到的


您需要更改linq语句,以便捕获结果集。

Chris Lively将我推向正确的方向,也就是说重新检查C#linq代码。下面从结果中提取字段_1。也许这是一种奇怪的方式到达那里,而不是正常的习惯用法,所以如果有人有更“正确”的建议,请添加评论或回答

var o = from res in db.MyProc( Val1, Val2 )
           select res.Field_1;
int key = o.ToArray()[0];

谢谢。

您是否尝试手动运行该过程,以确保它确实返回标识int?您可能需要使用@Identity而不是INSERTED.field_1@StriplingWarrior-OP的程序将正常工作。他的方法比选择
@@identity
更可靠,因为如果向表中添加插入触发器,它将正常工作。@StriplingWarrior-正如我提到的,在VS调试器中检查结果时,identity INT在那里(但不在ReturnValue中)。所以它不知怎么被退回了。我要的是用于检索该值的C#/Linq习惯用法。谢谢。嗯。。。如果必须的话,我会的,但让我困惑的是,我不知道如何获得输出插入值。它就在那里的某个地方;正如我所说,我可以通过检查
result.ReturnValue Results View
在VS调试器中看到它,如果您在VS中看到的ReturnValue总是值为0,那么它很可能不是您想要的。存储过程有一个int ReturnValue输出,指示成功或失败。看到这篇文章的底部:你让我为它工作,但你让我走上了正确的轨道。虽然我会接受这个,但是添加一个带有代码的答案。很高兴你得到了这个。我对Linq还不是很好,否则我会添加它。无论如何,这是正确的方法。
        int? newKey = null;
        dataContext.the_proc("val1", "val2", ref newKey);
        // newKey.Value now contains your new IDENTITY value
OUTPUT INSERTED.* 
var o = from res in db.MyProc( Val1, Val2 )
           select res.Field_1;
int key = o.ToArray()[0];