【问题标题】:Return newly inserted row id from stored procedure using LINQ toSQL使用 LINQ toSQL 从存储过程返回新插入的行 ID
【发布时间】:2016-01-31 07:47:47
【问题描述】:

我有一个存储过程如下:

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 wid 的值是插入操作期间创建的id。但由于某种原因,从 ASP.NET 中调用 SP 时返回 -1
  • @user2946329 我查看了链接,我正在做与答案完全相同的事情。唯一的区别是我没有从存储过程中返回实体。相反,我只是返回一个整数
  • @Alsmayer...所以你应该选择过程的返回值为Scalar。那么它应该可以工作了。

标签: c# sql-server linq stored-procedures


【解决方案1】:

在@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. 在我的实体框架模型文件中我 updated model from database 然后从模型浏览器导航到函数导入,右键单击我的函数然后编辑。我将返回值设置为标量

  2. 我右键单击我的受该功能影响的模型并选择Stored Procedure Mapping

我设置了 Result column binding 并将返回 id 与我的模型视图的 id 绑定

感谢大家的帮助

【讨论】:

    【解决方案2】:

    在我看来,您创建存储过程是为了在插入后返回 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);
    }
    

    【讨论】:

    • 尝试了这个对我来说看起来合乎逻辑的答案,但它在运行时抛出了这个错误Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.我试图用谷歌搜索它但没有运气。还有其他方法吗?
    • 您的sid 列是否自动递增(身份)?
    【解决方案3】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 2019-09-06
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多