在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值。
答案 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];
感谢。