ASP.NET MVC通过ExecuteSqlCommand获取插入项的ID(ASP.NET MVC Get the ID of Inserted Item by ExecuteSqlCommand)

编程入门 行业动态 更新时间:2024-10-23 15:22:03
ASP.NET MVC通过ExecuteSqlCommand获取插入项的ID(ASP.NET MVC Get the ID of Inserted Item by ExecuteSqlCommand)

我在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;

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;

最满意答案

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

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

像这样:

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:我将第一个解决方案应用于我的本地数据库,并且可以让它给出返回值。 经过一些研究,我得到了一个回报值。 我有一个带有Blog表的本地数据库。 我创建了一个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); }

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

更多推荐

本文发布于:2023-08-07 02:35:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1458988.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:MVC   NET   ASP   ExecuteSqlCommand   Item

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!