在c#中获取SQL INSERT OUTPUT值

时间:2010-12-01 22:47:40

标签: c# sql linq linq-to-sql

在SQL存储过程中,我插入一行并希望为新行返回IDENTITY INT,然后在我的C#代码中获取它。

ALTER PROCEDURE the_proc @val_2 VARCHAR(10), @val_3 VARCHAR(10)
AS
BEGIN
SET NOCOUNT ON
INSERT INTO the_table (field_2, field_3)
  OUTPUT INSERTED.field_1
  VALUES (@val_2, @val_3)
END

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

key = (int)(db.TheProc(val2,val3).ReturnValue);

key将返回0.我想要INSERT中的IDENTITY INT值。

3 个答案:

答案 0 :(得分:1)

尝试这样做(假设是SQL Server):

ALTER PROCEDURE the_proc 
@val_2 VARCHAR(10), 
@val_3 VARCHAR(10), 
@newKey int OUTPUT
AS
BEGIN
  SET NOCOUNT ON
  INSERT INTO the_table (field_2, field_3) VALUES (@val_2, @val_3)
  SET @newKey = SCOPE_IDENTITY()
END

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

        int? newKey = null;
        dataContext.the_proc("val1", "val2", ref newKey);
        // newKey.Value now contains your new IDENTITY value

答案 1 :(得分:1)

OUTPUT INSERTED.* 

与选择基本相同。因此,这不会显示为输出参数,而是作为结果集返回。

顺便说一句,ReturnValue实际应该为零,这就是你在这种情况下所看到的。

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

答案 2 :(得分:1)

Chris Lively在正确的方向上推动我,也就是说重新检查C#Linq代码。以下内容将Field_1从结果中拉出来。也许这是一种奇怪的方式来达到目的而不是正常的习惯用法,所以如果有人对更正确的东西有建议,请添加评论或回答。

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

感谢。