使用LINQ to SQL从存储过程返回新插入行的ID

3

我有一个存储过程如下:

ALTER PROCEDURE [dbo].[Addworkshop]
    @title varchar(100),
    @time varchar(10),
    @date date,
    @mandatory int,
    @sid int
AS
BEGIN
    SET NOCOUNT ON;

    insert into Workshop(title, date, time, mandatory, sid)
    values(@title, @date, @time, @mandatory, @sid)

    declare @wid int
    set @wid = scope_identity()
    return @wid
END 

我在ASP.NET MVC5 C#中的操作方法中调用它:

public JsonResult addWorkshop(Workshop workshop)
{
        TLCWREntities context = new TLCWREntities();
        var wid = db.Addworkshop(workshop.title, workshop.time, workshop.date, workshop.mandatory, workshop.sid);
        return Json(wid);
}

使用JSON ajax调用此方法:

 $.ajax({

     type: 'POST',
     url: '@Url.Action("addWorkshop")', // we are calling json method

     dataType: 'json',

     data: $.toDictionary(wsData),


      success: function (wid) {
                        console.log("success add workshop wid: "+wid);

                    },
      error: function (ex) {
                        console.log("err add workshop");

                    }
                });

数据已成功插入到表中,当我在SQL Server Management Studio中执行存储过程时,它会返回正确的新插入行ID。然而,当我使用JSON ajax和操作方法调用存储过程时,它总是返回-1。

我正在使用Visual Studio 2013 MVC5 C#和SQL Server Studio 2008。


返回之前,wid 的值是什么? - iuliu.net
1
看一下这个:https://dev59.com/0FwY5IYBdhLWcg3w2K3c - Salah Akbari
对于你的问题@iuliu.net,wid的值是在插入操作期间创建的ID。但由于某种原因,当从ASP.NET中调用SP时,它返回-1。 - Alsmayer
@user2946329 我查看了链接,我正在按照答案做完全相同的事情。唯一的区别是我没有从存储过程中返回实体表单,而是只返回一个整数。 - Alsmayer
1
@Alsmayer...所以你应该选择过程的返回值为“标量”。然后它就可以工作了。 - Salah Akbari
3个回答

4
在@user2946329的帮助下并通过在谷歌上搜索,我成功找到了答案。 1. 我修改了我的存储过程如下:
insert into Workshop(title, date, time, mandatory, sid)
values(@title, @date, @time, @mandatory, @sid)
declare @wid int
set @wid = SCOPE_IDENTITY()
select @wid AS wid

我使用select语句而不是return语句返回了最后插入的行id。

  1. 在我的Entity Framework模型文件中,我使用了从数据库更新模型,然后从模型浏览器中导航到函数导入,右键单击我的函数,然后选择编辑。我将返回值设置为标量 enter image description here

  2. 我右键单击受该函数影响的模型,并选择存储过程映射 enter image description here

我设置了结果列绑定,并将返回的id与我的模型视图的id绑定在一起 enter image description here

感谢所有人的帮助。


0

根据我的理解,您创建了存储过程以便在插入后返回一个ID,针对这种情况,我强烈建议采用以下方法:

public JsonResult addWorkshop(Workshop workshop)
{
    TLCWREntities context = new TLCWREntities();
    db.Workshops.Add(workshop);
    db.SaveChanges(); //when this executes, `workshop` gets its `id` field populated
    return Json(workshop.sid);
}

我尝试了这个看起来很合理的答案,但在运行时它抛出了这个错误:存储更新、插入或删除语句影响了意外数量的行(0)。自实体加载以来,可能已经修改或删除了实体。请刷新ObjectStateManager条目。 我试着在谷歌上搜索,但没有找到解决方法。还有其他的解决方法吗? - Alsmayer
你的 sid 列是自增的(identity)吗? - iuliu.net

0

试一下这个

int workShopId = 0;
using (TLCWREntities context = new TLCWREntities ())
{
    context.Workshop.InsertOnSubmit(workshop);
    context.SubmitChanges();
    workShopId = workshop.ID;//ID is column from you workshop table
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接