我有一个SQL Server表,使用以下方法插入行:
var sql = @"
DECLARE @InsertedRows AS TABLE (Id BIGINT);
INSERT INTO Person ([Name], [Age]) OUTPUT Inserted.Id INTO @InsertedRows
VALUES (@Name, @Age);
SELECT Id FROM @InsertedRows;";
Person person = ...;
var id = connection.Query<long>(sql, person).First();
如果我尝试插入多个项目并使用以下命令返回所有插入的ID,这一切都很有效。
IEnumerable<Person> people = ...;
var ids = connection.Query<long>(sql, people);
我收到错误:
System.InvalidOperationException:在此上下文中不允许使用可枚举的参数序列(数组,列表等)
在Dapper.SqlMapper.GetCacheInfo(身份标识,对象exampleParameters,布尔addToCache)
在Dapper.SqlMapper.d__23`1.MoveNext()
---从抛出异常的先前位置开始的堆栈跟踪结束---
如何在Dapper中返回多个插入的ID?
答案 0 :(得分:3)
某些东西需要循环。你有一个sql语句插入一行,代码发送在列表中。既然你喜欢字符串文字中的SQL,我会坚持一次插入一个人,将循环放在C#中并使用SELECT SCOPE_IDENTITY()
恢复C#中的每个id。您不再需要@InsertedRows或OUTPUT。
如果你真的想在SQL中循环,我相信你需要查看表值参数来传递插入列表。 Dapper非常乐意返回多个ID。它抱怨多人作为输入参数。
有一天,希望很快,我们将回顾字符串文字中的SQL,就像我们目前看goat sacrifice一样。