2008-11-24 47 views

回答

0

在第一張表上執行插入語句後,你應該立即查詢@@ IDENTITY做「SELECT @@ identity」。這將檢索最後一個自動生成的ID ...然後將其插入到第二個表中。

如果您使用觸發器或插入行的東西...這可能是行不通的。使用Scope_Identity()代替@@ IDENTITY

0

如果你有所有需要推送到可用標籤表的數據,我可能會在指定的條目表上使用INSERT觸發器來完成此操作。如果沒有,那麼你可能要考慮使用一個在事務內部創建的存儲過程。

如果你想在代碼中做到這一點,你需要更具體地說明你如何管理你的數據。你在使用DataAdapter,DataTables,LINQ,NHibernate ......嗎?從本質上講,你需要將兩個插入包裝在某種事務中,以便插入可以被執行或者兩者都不會執行,但是要做到這一點取決於你使用什麼技術來與數據庫交互。

+0

感謝您的處理,但我從未使用過存儲過程或觸發器。我在我的項目中使用動態sql,如果有辦法用動態sql做到這一點,它會更好。 – mavera 2008-11-24 18:48:46

4

要做到這一點的唯一方法是使用多個語句。使用動態SQL您可以在您的查詢字符串用分號分隔每個語句做到這一點:

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

確保你把這個交易,以防止併發問題,並保持它的所有原子。如果你願意的話,你也可以把它分成兩個單獨的查詢來在中間返回新的ID值;只要確保兩個查詢都在同一個事務中。

另外:你正在使用你的動態sql的參數化查詢,對吧?如果你不是,我會親自過來,用溼麪條舔你10000次,直到你悔改你的不安全的方式。

+0

如果第二次插入失敗,您將希望將這些包裝在事務中。 – tvanfosson 2008-11-24 19:02:43

+0

非常正確。更新以使其更清晰。 – 2008-11-24 19:12:25

0

如果您使用動態sql,那麼爲什麼不使用Linq to Entity Framework,現在EF是來自Microsoft的推薦數據訪問技術(請參閱此帖來自ADO.NET團隊博客Clarifying the message on L2S Futures),如果您使用EF進行插入,最後的身份ID將自動提供給您,所以我一直使用它很容易。

希望這會有所幫助!

Ray。

相關問題