Pet*_*eld 8 sql-server petapoco
我们使用PetaPoco作为SQL 2008数据库的数据访问工具.尝试在附加了触发器的表上插入/更新行时出现问题.
我们正在使用PetaPoco的db.Save(对象);
显示的错误是:如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'the_table_with_a_trigger'不能具有任何已启用的触发器.
我们如何使用PetaPoco在具有触发器的表上插入/更新数据?
感谢@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语句检索标识.
| 归档时间: |
|
| 查看次数: |
1654 次 |
| 最近记录: |