我正在使用Rob Conery的Massive进行数据库访问。我想围绕几个插入包装事务,但第二个插入使用从第一个插入返回的标识。对我来说,在交易中如何做到这一点并不明显。一些帮助将不胜感激。
var commandList = new List<DbCommand>
{
contactTbl.CreateInsertCommand(new
{
newContact.Name,
newContact.Contact,
newContact.Phone,
newContact.ForceChargeThreshold,
newContact.MeterReadingMethodId,
LastModifiedBy = userId,
LastModifiedDate = modifiedDate,
}),
branchContactTbl.CreateInsertCommand(new
{
newContact.BranchId,
ContactId = ????, <-- how to set Id as identity from previous command
}),
};
答案 0 :(得分:2)
在这两个插入之间进行查询,Massive中的这个方法可能很有用:
public object Scalar(string sql, params object[] args) {
object result = null;
using (var conn = OpenConnection()) {
result = CreateCommand(sql, conn, args).ExecuteScalar();
}
return result;
}
你的sql将是=“select scope_identity()”
更新2013/02/26
再看一下Massive代码,没有可靠的方法来检索最后插入的ID。
上面的代码只有在汇总了“select scope_identity()”的连接时才有效。 (它必须与插入的连接相同)。
Massive table.Insert(..)
方法返回包含ID字段的Dynamic,其中填充了“SELECT @@ IDENTITY”。它从全局范围获取最后插入的ID,这是明显的错误(在多线程场景中很明显)。
答案 1 :(得分:1)
你能在存储过程中执行此操作吗?您可以使用scope_identity或更好的输出子句来获取所需的值。并且所有表的所有插入都在一个事务中,如果其中任何一个失败,则可以回滚。