Sql server 使用简洁的点网获取最后插入的id
我正在使用Microsoft Visual Studio Express 2012 for Web来开发MVC5应用程序。我想使用Dapper dot net获取最后一个插入的ID。我在这里找到了解决方案,但它们正在SQL Server 2012(Management Studio)上工作,但当我在代码中运行查询时,返回的值是错误的。下面是我已经尝试获取最后一个插入ID的代码片段Sql server 使用简洁的点网获取最后插入的id,sql-server,asp.net-mvc,visual-studio-2012,asp.net-mvc-5,Sql Server,Asp.net Mvc,Visual Studio 2012,Asp.net Mvc 5,我正在使用Microsoft Visual Studio Express 2012 for Web来开发MVC5应用程序。我想使用Dapper dot net获取最后一个插入的ID。我在这里找到了解决方案,但它们正在SQL Server 2012(Management Studio)上工作,但当我在代码中运行查询时,返回的值是错误的。下面是我已经尝试获取最后一个插入ID的代码片段 SqlConnection _db = new SqlConnection("String");
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 });
SqlConnection\u db=newsqlconnection(“字符串”);
字符串查询_1=@“将@InsertedRows声明为表(user_id int);插入到用户(stuff)输出Inserted.user_id到@InsertedRows值(@stuff);从@InsertedRows中选择user_id”;
字符串查询_2=@“插入到用户(stuff)输出插入。用户_id值(@stuff);”;
字符串查询_3=@“插入用户(stuff)值(@stuff);选择范围_标识()”;
1.var id=_db.Query(Query_x,new{stuff=@stuff});
2.var id=_db.Execute(query_x,new{stuff=@stuff});
但在这两种情况下ID的值都是1,但不是实际结果。但是,当我在SQL management Studio上运行相同的查询时,一切都正常了。请帮助解决此问题 我认为问题在于您使用的是SCOPE\u IDENTITY() (文件地址: 返回插入到同一作用域中的标识列中的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理) 您可能希望从IDENT_CURRENT()获得结果 (文件地址:
返回为指定表或视图生成的最后一个标识值。生成的最后一个标识值可以是任何会话和任何作用域)好的,我将回答我自己提出的问题,在Dapper中进行其他搜索后得到答案我们有一个扩展方法
。Single()
将返回新添加的选定值的值,即
var id = _db.Query<int>(query_x, new { stuff = @stuff }).Single();
var id=_db.Query(Query_x,new{stuff=@stuff}).Single();
在我的例子中,它将返回新添加的主键值。我只是添加了.Single()
函数来获得新的附加值。输出插入
供参考,这可能比使用范围标识慢,并且在SQL Server 2008 R2 Service Pack 1的更新5中得到了修复