【问题标题】:Using Dapper Dot Net get last inserted id [duplicate]使用 Dapper Dot Net 获取最后插入的 id [重复]
【发布时间】:2015-08-15 20:28:28
【问题描述】:

我正在使用 Microsoft Visual Studio Express 2012 for Web 来开发 MVC5 应用程序。我想使用 Dapper dot net 获取最后插入的 ID。我在这里得到了解决方案,但他们正在使用 SQL Server 2012 (Management Studio),但是当我在代码中运行查询时,返回值是错误的。这是我已经尝试获取最后插入的 ID 的代码片段

SqlConnection _db = new SqlConnection("String");

        string query_1 = @"DECLARE @InsertedRows AS TABLE (user_id int);Insert into users (stuff) OUTPUT Inserted.user_id INTO @InsertedRows values(@stuff); SELECT user_id FROM @InsertedRows";
        string query_2 = @"Insert into users (stuff) OUTPUT Inserted.user_id values(@stuff);";
        string query_3 = @"Insert into users (stuff) values(@stuff); SELECT SCOPE_IDENTITY()";

        1. var id = _db.Query<int>(query_x, new { stuff = @stuff });
        2. var id = _db.Execute(query_x, new { stuff = @stuff });

但在这两种情况下 ID 的值都是 1 但不是实际结果。但是当我在 SQL management Studio 上运行相同的查询时,一切正常。请帮助解决这个问题。

【问题讨论】:

  • OUTPUT Inserted 仅供参考,这可能比使用 SCOPE_IDENTITY 慢,并且已在 SQL Server 2008 R2 Service Pack 1 的更新 #5 中修复

标签: sql-server asp.net-mvc visual-studio-2012 asp.net-mvc-5


【解决方案1】:

好的,我将回答我自己提出的问题,我在 Dapper 中进行了一些其他搜索后得到了答案,我们有一个扩展方法 .Single(),它将返回新添加的 Selectd 值的值,即

var id = _db.Query<int>(query_x, new { stuff = @stuff }).Single();

在我的情况下,它将返回新添加的主键值的值。我只是添加.Single()函数来获得新的附加值。

【讨论】:

    【解决方案2】:

    我认为问题在于您使用的是 SCOPE_IDENTITY() (文件https://msdn.microsoft.com/en-us/library/ms190315.aspx: 返回插入同一范围内的标识列的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理)

    您可能想要 IDENT_CURRENT() 的结果 (文件https://msdn.microsoft.com/en-us/library/ms175098.aspx: 返回为指定表或视图生成的最后一个标识值。最后生成的身份值可以用于任何会话和任何范围。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2014-07-07
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多