我将用一个例子来解释问题:
我的数据库中有两个表,命名条目,标签
两个表中都有一个名为 ID_ENTRY 的列。当我将记录添加到表条目时,我必须获取最后添加记录的 ID_ENTRY 并将其添加到表标签中。我该怎么做?
我将用一个例子来解释问题:
我的数据库中有两个表,命名条目,标签
两个表中都有一个名为 ID_ENTRY 的列。当我将记录添加到表条目时,我必须获取最后添加记录的 ID_ENTRY 并将其添加到表标签中。我该怎么做?
做到这一点的唯一方法是使用多个语句。使用动态 sql,您可以通过用分号分隔查询字符串中的每个语句来做到这一点:
"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
确保将其放入事务中以防止并发问题并使其保持原子性。如果需要,您还可以将其分解为两个单独的查询以在中间返回新的 ID 值;只要确保两个查询都在同一个事务中。
另外:您正在对动态 sql 使用参数化查询,对吗?如果你不是,我会亲自到那里用湿面条打你一万次,直到你悔改不安全的方式。
如果您有所有需要推送到可用标签表的数据,我可能会在命名条目表上使用 INSERT 触发器来执行此操作。如果没有,那么您可能需要考虑使用在事务中创建两者的存储过程。
如果您想在代码中执行此操作,则需要更具体地了解如何管理数据。你在使用 DataAdapter、DataTables、LINQ、NHibernate 吗?本质上,您需要将两个插入都包装在某种事务中,以便插入执行或不执行,但执行此操作的方法取决于您用于与数据库交互的技术。
在第一个表上执行插入语句后,您应该立即查询 @@IDENTITY 执行“SELECT @@identity”。这将检索最后一个自动生成的 ID ...然后将其插入到第二个表中。
如果您使用触发器或插入行的东西......这可能不起作用。使用 Scope_Identity() 而不是 @@IDENTITY
如果您使用动态 sql,为什么不使用 Linq to Entity Framework,现在 EF 是 Microsoft 推荐的数据访问技术(请参阅这篇文章Clarifying the message on L2S Futures from ADO.NET 团队博客),如果您使用 EF 进行插入最后一个身份 ID 将自动为您提供,我一直使用它很容易。
希望这可以帮助!
射线。