ASP.NET MVC获取插入项目的ID,由ExecuteSqlCommand [英] ASP.NET MVC Get the ID of Inserted Item by ExecuteSqlCommand

查看:1978
本文介绍了ASP.NET MVC获取插入项目的ID,由ExecuteSqlCommand的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我插在我的ASP.NET MVC3项目如下:

  VAR的查询=INSERT INTO MyTable的VALUES(//一些值);
db.Database.ExecuteSqlCommand(查询);
 

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

编辑:

我的存储过程:

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

我的code线:

 串DT = DateTime.Now.ToString(YYYY-MM-DD HH:MM:SS);
的SqlParameter PersonnelID =新的SqlParameter(@ PersonnelID,1);
的SqlParameter ShiftWorkID =新的SqlParameter(@ ShiftWorkID,2);
的SqlParameter EntranceDateTime =新的SqlParameter(@ EntranceDateTime,DT);
的SqlParameter WorkflowStateRelationID =新的SqlParameter(@ WorkflowStateRelationID,db.WorkflowStateRelations.Where(WSR => wsr.WorkflowID == dp.WorkflowID)。选择(X => x.ID).FirstOrDefault());
的SqlParameter的returnValue =新的SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;

//尝试1
db.Database.ExecuteSqlCommand(addGetID(@PersonnelID,@ShiftWorkID,@EntranceDateTime,@WorkflowStateRelationID),PersonnelID,ShiftWorkID,EntranceDateTime,WorkflowStateRelationID,的returnValue);

//尝试2
db.Database.ExecuteSqlCommand(addGetID @PersonnelID @ShiftWorkID @EntranceDateTime @WorkflowStateRelationID,PersonnelID,ShiftWorkID,EntranceDateTime,WorkflowStateRelationID,的returnValue);

//尝试3
db.Database.ExecuteSqlCommand(EXEC addGetID @ PersonnelID = {0} @ ShiftWorkID = {1} @ EntranceDateTime = {2} @ WorkflowStateRelationID = {3},PersonnelID,ShiftWorkID,EntranceDateTime,WorkflowStateRelationID,的returnValue);

VAR ID = returnValue.Value;
 

解决方案

我同意[scartag] [1]在这一个。但是,为了回答两部分你的问题。

如果你要使用直接的SQL则要做的是创建一个存储过程,返回 @@ IDENTITY 值。然后你用 ParameterDirection.ReturnValue 的参数exec的你的SP,并使用该值。

像这样的:

 的SqlParameter entityField =新的SqlParameter(@名字,弗兰克);
的SqlParameter的returnValue =新的SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;
db.Database.ExecuteSqlCommand(sp_ByPassEFAndInsertEntity(@firstName),
                              entityField,的returnValue);
VAR ID = returnValue.Value;
 

或者只是使用EF。创建和初始化你的实体,将其添加到适用 DbSet 和调用的SaveChanges。你的实体实例的Id列将与由数据库生成的值了。

编辑2:我申请了第一个解决方案,我的一个本地数据库,并能得到它给出一个返回值无论是。经过一番研究,我能得到一个返回值。我有一个本地数据库与博客表。我创建了一个addBlog SP,这是你可以得到一个返回值 - 但不是使用ExecSqlCommand您必须使用SqlQuery类

下面是我的SP:

  ALTER PROCEDURE [DBO]。[addBlog]
        @BlogName的varchar(50),
        @CreateDateTime日期时间
    如
    开始
        插入博客(名称,DateTimeCreated)值(@BlogName,@CreateDateTime)
        声明@返回INT
        设置@return = @@身份
        选择@return
    结束
 

和我的EF code:

 使用(VAR DB =新StackOverflowEntities()){
        的SqlParameter BLOGNAME =新的SqlParameter(BLOGNAME,新名称2);
        的SqlParameter CREATEDATE =新的SqlParameter(CREATEDATE,DateTime.Now);

        诠释? newIdentityValue = db.Database.SqlQuery<的Int32>(addBlog @BlogName,@CreateDate,BLOGNAME,CREATEDATE).FirstOrDefault();

        的Debug.WriteLine(newIdentityValue);
    }
 

I do insertion with following in my ASP.NET MVC3 project:

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

Is there an easy way to get the inserted row's ID?

EDIT:

My stored procedure:

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

My code lines:

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;

解决方案

I agree with [scartag][1] on this one. But to answer your question in 2 parts.

If you're going to use direct sql then the thing to do is create a stored proc that returns the @@IDENTITY value. Then you exec your Sp with a parameter of ParameterDirection.ReturnValue and use that value.

Like such:

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;

Or just use EF. Create and initialize your Entity, add it to the applicable DbSet and call savechanges. Your Entity instance's Id column will be updated with the value generated by the database.

EDIT 2: I applied the first solution to a local db of mine and could get it to give a return value either. After some research I was able to get a return value. I have a local db with a Blog table. I created an addBlog SP and this is how you can get a return value - but instead of using ExecSqlCommand you must use SqlQuery.

Here's my 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

and my EF code:

    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);
    }

这篇关于ASP.NET MVC获取插入项目的ID,由ExecuteSqlCommand的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆