如何获取通过存储过程插入的行ID?

时间:2016-11-23 06:20:06

标签: c# sql-server entity-framework stored-procedures

Model model=new Model();
model.id=0;
model.name="";
model.surname="";
db.Model.Add(model);
db.SaveChanges();
int id_returned=model.id;

这个块给了我插入行的id字段。

但我使用存储过程进行此插入过程。

Model model=new Model();
model.id=0;
model.name="";
model.surname="";
int returned_id2=db.Sp_Model_insert(model.name, model.surname);

此块插入行。 returned_id2 返回 -1

如何获取通过Sp插入的行ID?

这是我的存储过程:

USE [KayaShop]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [KS_ACCOUNTS].[SP_AccountModules_Insert](
@Area nvarchar(50),
@Controller nvarchar(50),
@Action nvarchar(50),
@SubAction nvarchar(50),
@Name nvarchar(50),
@TopName nvarchar(50),
@Level int,
@Visible int,
@Clickable int,
@HomePage int,
@Icon nvarchar(20),
@Status int
)
AS 
BEGIN 
 SET NOCOUNT ON 
 INSERT INTO [KS_ACCOUNTS].[AccountModules]
       ([Area]
       ,[Controller]
       ,[Action]
       ,[SubAction]
       ,[Name]
       ,[TopName]
       ,[Level]
       ,[Visible]
       ,[Clickable]
       ,[HomePage]
       ,[Icon]
       ,[Status])
 VALUES
       (@Area,
       @Controller,
       @Action,
       @SubAction,
       @Name,
       @TopName,
       @Level,
       @Visible,
       @Clickable,
       @HomePage,
       @Icon,
       @Status)
END

3 个答案:

答案 0 :(得分:1)

多种方式:

由于您的存储过程似乎只插入一行,因此您可以使用SCOPE_IDENTITY

请注意,如果您的所有存储过程都是INSERT,那么您可能不需要存储过程,您的数据库客户端代码应该直接执行INSERT

请注意,您不应使用RETURN关键字将IDENTITY值返回给调用者,您应该使用输出参数 - 存储过程的返回值旨在传达状态信息仅限于int值(例如,成功返回0)。

答案 1 :(得分:1)

SELECT SCOPE_IDENTITY()

在存储过程中的插入查询后添加此内容

答案 2 :(得分:0)

我将这些行添加到我的sp:

的末尾
SELECT @Id =SCOPE_IDENTITY()
RETURN

在我的代码方面:

int Id = 0;
ObjectParameter prm = new ObjectParameter("Id", typeof(int));
DB.SP_AccountModules_Insert(DTO.Area, DTO.Controller, DTO.Action, DTO.SubAction, DTO.Name, DTO.TopName, DTO.Level, DTO.Visible, DTO.Clickable, DTO.HomePage, DTO.Icon, DTO.Status, prm);
Id = Convert.ToInt32(prm.Value);
return Id;

我从我的代码发送和输出参数到我的sp,然后我将最后插入的id分配给我的参数并将其返回到我的代码。而已。 谢谢你的帮助。