【问题标题】:How to Get Last Created Entry's ID From Sql Database With Asp.Net如何使用 Asp.Net 从 Sql 数据库中获取最后创建的条目的 ID
【发布时间】:2008-11-24 18:40:28
【问题描述】:

我会用一个例子来解释问题:

我的数据库中有两个表,命名为entry,tags

两个表中都有一个名为 ID_ENTRY 的列。当我将记录添加到表条目时,我必须获取最后添加记录的 ID_ENTRY 并将其添加到表标签中。我该怎么做?

【问题讨论】:

    标签: asp.net sql-server transactions


    【解决方案1】:

    做到这一点的唯一方法是使用多个语句。使用动态 sql,您可以通过用分号分隔查询字符串中的每个语句来做到这一点:

    "DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
    

    确保将其放入事务中以防止并发问题并使其保持原子性。如果需要,您还可以将其分解为两个单独的查询以在中间返回新的 ID 值;只需确保两个查询都在同一个事务中。

    另外:您正在对动态 sql 使用参数化查询,对吗?如果你不是,我会亲自过来,用湿面条打你一万下,直到你为自己的不安全行为忏悔。

    【讨论】:

    • 您需要将它们包装在事务中,以防第二次插入失败。
    【解决方案2】:

    在第一个表上执行插入语句后,您应该立即查询@@IDENTITY,执行“SELECT @@identity”。这将检索最后一个自动生成的 ID...然后将其插入到第二个表中。

    如果您使用触发器或插入行的东西......这可能不起作用。使用 Scope_Identity() 而不是 @@IDENTITY

    【讨论】:

    • scope_identity() 通常在触发器之外也优于@@identity:您确定以后不会添加触发器,默默地“破坏”代码吗?
    • SCOPE_IDENTITY() 只是觉得我想要
    【解决方案3】:

    如果您拥有所有需要推送到可用标签表的数据,我可能会在命名条目表上使用 INSERT 触发器来执行此操作。如果没有,那么您可能需要考虑使用在事务中创建两者的存储过程。

    如果您想在代码中执行此操作,则需要更具体地了解如何管理数据。你在使用 DataAdapter、DataTables、LINQ、NHibernate 吗?本质上,您需要将两个插入都包装在某种事务中,以便插入执行或不执行,但执行此操作的方法取决于您用于与数据库交互的技术。

    【讨论】:

    • 感谢您的支持,但我从未使用过存储过程或触发器。我在我的项目中使用了动态sql,如果有办法用动态sql做到这一点,那就更好了。
    【解决方案4】:

    如果您使用动态 sql,为什么不使用 Linq to Entity Framework,现在 EF 是微软推荐的数据访问技术(参见 ADO.NET 团队博客中的这篇帖子Clarifying the message on L2S Futures),如果您使用 EF 进行插入最后一个身份 ID 将自动为您提供,我一直使用它很容易。

    希望这会有所帮助!

    雷。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2021-10-01
      • 2020-11-28
      • 2019-10-11
      相关资源
      最近更新 更多