【问题标题】:Want to use identity returned from insert in subsequent insert in a transaction想要在事务的后续插入中使用从插入返回的身份
【发布时间】:2011-03-23 21:13:14
【问题描述】:

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

【问题讨论】:

    标签: c# sql orm massive


    【解决方案1】:

    在这两个插入之间进行查询,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 年 2 月 26 日更新

    再次查看大规模代码,没有可靠的方法来检索最后插入的 ID。

    上面的代码只有在“select scope_identity()”连接被池化时才有效。 (它必须与插入的连接相同)。

    Massive table.Insert(..) 方法返回包含 ID 字段的 Dynamic,该字段用“SELECT @@IDENTITY”填充。它从全局范围获取最后插入的 ID,这是明显的错误(在多线程场景中很明显)。

    【讨论】:

    • 谢谢 Dooh - 请记住,我需要将身份输入到下一个命令中,这不符合 Massive 模式。目前,我正在通过将 Massive 中的代码提取到我的课程中来解决这个问题,这并不理想。
    • 调用 Scalar 不会返回请求的值,因为它将打开一个新连接(请参阅 Massive.cs)使用 var newID = table.Insert(...) 然后检查 newId.ID 另请参阅 stackoverflow.com/questions/15075913/…
    • 嗯,你是对的。我想它主要是因为连接池。但是查看 Massive 代码时,它被窃听了,@@Identity 从全局范围获取最后插入的 ID,而不是从当前连接范围获取。
    • 请记住,您永远不想为此返回@@identity(如果有人在表上放置触发器以插入具有标识的另一个表,那么您将失去数据完整性)并且如果这个 Massive 这样做,写它的人显然不擅长访问 sql server 数据库。如果他犯了这个基本的错误,那么谁知道其余的写得有多糟糕。
    【解决方案2】:

    你能在存储过程中做吗?您可以使用 scope_identity 或更好的输出子句来获取您需要的值。并且所有表的所有插入都在一个事务中,如果其中任何一个失败,可以回滚。

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多