想要在事务中的后续插入中使用从insert返回的标识

时间:2011-03-23 21:13:15

标签: c# sql orm massive

我正在使用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
            }),
    };

2 个答案:

答案 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或更好的输出子句来获取所需的值。并且所有表的所有插入都在一个事务中,如果其中任何一个失败,则可以回滚。