2

我在我的 ASP.NET MVC3 项目中插入以下内容:

var query = "INSERT INTO MyTable VALUES(//some values)";
db.Database.ExecuteSqlCommand(query);

有没有一种简单的方法来获取插入行的 ID?

编辑:

我的存储过程:

CREATE PROCEDURE addGetID
( 
    @PersonnelID INT,
    @ShiftWorkID BIGINT,
    @EntranceDateTime DATETIME,
    @WorkflowStateRelationID BIGINT
)
AS
INSERT INTO DynamicDataEntrances VALUES (@PersonnelID, @ShiftWorkID, @EntranceDateTime, @WorkflowStateRelationID)
SELECT @@IDENTITY

我的代码行:

string dt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
SqlParameter PersonnelID = new SqlParameter("@PersonnelID", 1);
SqlParameter ShiftWorkID = new SqlParameter("@ShiftWorkID", 2);
SqlParameter EntranceDateTime = new SqlParameter("@EntranceDateTime", dt);
SqlParameter WorkflowStateRelationID = new SqlParameter("@WorkflowStateRelationID ", db.WorkflowStateRelations.Where(wsr => wsr.WorkflowID == dp.WorkflowID).Select(x => x.ID).FirstOrDefault());
SqlParameter returnValue = new SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;

// try 1
db.Database.ExecuteSqlCommand("addGetID(@PersonnelID, @ShiftWorkID, @EntranceDateTime, @WorkflowStateRelationID )", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);

// try 2
db.Database.ExecuteSqlCommand("addGetID @PersonnelID @ShiftWorkID @EntranceDateTime @WorkflowStateRelationID ", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);

// try 3
db.Database.ExecuteSqlCommand("exec addGetID @PersonnelID={0} @ShiftWorkID={1} @EntranceDateTime={2} @WorkflowStateRelationID={3} ", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);

var id = returnValue.Value;
4

3 回答 3

4

我同意 [scartag][1] 的观点。但要分两部分回答你的问题。

如果您要使用直接 sql,那么要做的是创建一个返回@@IDENTITY值的存储过程。然后你用参数执行你的 SpParameterDirection.ReturnValue并使用该值。

像这样:

SqlParameter entityField = new SqlParameter("@firstName", "Frank");
SqlParameter returnValue = new SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;
db.Database.ExecuteSqlCommand("sp_ByPassEFAndInsertEntity(@firstName)", 
                              entityField, returnValue);
var id = returnValue.Value;

或者只使用EF。创建并初始化您的Entity,将其添加到适用的DbSet并调用 savechanges。您的 Entity 实例的 Id 列将使用数据库生成的值进行更新。

编辑2:我将第一个解决方案应用于我的本地数据库,并且可以让它给出一个返回值。经过一番研究,我能够得到一个返回值。我有一个带有博客表的本地数据库。我创建了一个 addBlog SP,这就是您获取返回值的方式 - 但您必须使用 SqlQuery,而不是使用 ExecSqlCommand。

这是我的SP:

    ALTER PROCEDURE [dbo].[addBlog] 
        @BlogName varchar(50),
        @CreateDateTime datetime
    AS
    BEGIN
        insert into Blog (Name, DateTimeCreated) values (@BlogName, @CreateDateTime)
        declare @return int
        set @return = @@identity
        select @return
    END

和我的 EF 代码:

    using (var db = new StackOverflowEntities()) {
        SqlParameter blogName = new SqlParameter("BlogName", "New Name 2");
        SqlParameter createDate = new SqlParameter("CreateDate", DateTime.Now);

        int? newIdentityValue = db.Database.SqlQuery<Int32>("addBlog @BlogName, @CreateDate", blogName, createDate).FirstOrDefault();

        Debug.WriteLine(newIdentityValue);
    }
于 2013-01-06T14:00:05.853 回答
1

不可以。您无法通过此方法获取插入行的 ID。

它只返回一个 int (告诉你受影响的行数)。

您的代码告诉我您已经在使用 EF,那么为什么不使用 API 的其他方面呢?

既然您似乎热衷于使用原始 sql 路线,为什么不使用像 dapper、mass 或 petapoco 这样的工具呢?

于 2013-01-06T13:45:43.697 回答
-1
SELECT scope_identity()

作为您的返回值

于 2013-04-19T13:10:02.540 回答