使用触发器,PetaPoco插入失败

Pet*_*eld 8 sql-server petapoco

我们使用PetaPoco作为SQL 2008数据库的数据访问工具.尝试在附加了触发器的表上插入/更新行时出现问题.

我们正在使用PetaPoco的db.Save(对象);

显示的错误是:如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'the_table_with_a_trigger'不能具有任何已启用的触发器.

我们如何使用PetaPoco在具有触发器的表上插入/更新数据?

Pet*_*eld 7

感谢@Eduardo Molteni,你让我走上正确的道路来解决这个问题.显然,SQL Server 2008 R2中的已知问题是,如果表具有触发器,则插入中的OUTPUT命令将失败.但是,PetaPoco会自动将OUTPUT子句插入到表中AutoIncrement = true的任何插入的命令文本中.

对我来说,(对于SQL Server 2008 R2)的解决方案如下:

1)转到PetaPoco.DatabaseTypes.SqlServerDatabaseType.GetInsertOutputClause函数

删除(注释掉) \\return String.Format(" OUTPUT INSERTED.[{0}]", primaryKeyName);

这将从SQL插入语句中删除"OUTPUT".现在,插入将发生在带触发器的表上.但是,现在PetaPoco无法从新插入的行中检索新的主键(标识).

2)转到PetaPoco.Database.Insert函数.紧接在线之上:

object id = _dbType.ExecuteInsert(this, cmd, primaryKeyName);
Run Code Online (Sandbox Code Playgroud)

添加一个新行,所以它看起来像这样:

 cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;";
 object id = _dbType.ExecuteInsert(this, cmd, primaryKeyName);
Run Code Online (Sandbox Code Playgroud)

新行(存在于PetaPoco中,但未被使用)将允许insert语句检索标识.