【发布时间】:2016-09-20 09:16:51
【问题描述】:
我正在使用带有 C# 的 Dapper,后端是 MS Access。我的 DAL 方法在数据库中插入记录。我想返回插入行的唯一标识符(或使用唯一标识符更新的 POCO)。 我期待我的功能如下(我知道这不起作用;只是为了解释我想要的):-
public MyPoco Insert(MyPoco myPoco)
{
sql = @"INSERT INTO MyTable (Field1, Field2) VALUES (@Field1, @Field2)";
var param = GetMappedParams(myPoco);//ID property here is null.
var result = _connection.Query<MyPoco>(sql, param, null, false, null, CommandType.Text);.Single();
return result;//This result now contains ID that is created by database.
}
我来自 NHibernate 世界,POCO 会自动使用 NH 进行更新。如果不;我们可以调用 Refresh 方法并更新 ID。 我不知道如何使用 Dapper 实现这一目标。
我阅读了关于 SO 的 this 问题,该问题与 SQL Server 无关。
另一个this 的问题没有被接受的答案。
我阅读了this 问题,其中接受的答案解释了使用@@Identity 的陷阱。
【问题讨论】:
-
@progpow:您建议SELECT @@Identity。我不确定这是否可靠。我的应用程序是多用户应用程序,其中多个用户将同时在同一个表中插入记录。据我了解,不建议这样做。如果我错了,请纠正我。
-
你可以测试,我写了一个答案,但找不到。使用隔离实例(设置 db=currentdb),在 sql 之前暂停并手动插入记录。我想你会发现它是真的。
-
对不起;那是我的错误。
@@Identity总是返回零,因为我从未明确打开(和关闭)连接。在这种情况下,Dapper 在内部打开(和关闭)连接。在为执行@@Identity查询打开新连接时,它返回零。 -
@tomRedox - 它专门指event-driven Data Macros,这是一种特殊的宏,其行为类似于trigger。其他插入,例如从 VBA 代码或绑定表单执行的插入,不太可能导致使用
SELECT @@IDENTITY出现问题。