我會解釋問題的例子:如何獲得最新創建的條目的ID從SQL數據庫Asp.Net
在兩個表我的數據庫,命名項,標籤
有一個名爲列ID_ENTRY在這兩個表中。當我添加一個記錄到表中,條目時,我必須將最後添加的記錄的ID_ENTRY添加到表格標籤中。我該怎麼做?
我會解釋問題的例子:如何獲得最新創建的條目的ID從SQL數據庫Asp.Net
在兩個表我的數據庫,命名項,標籤
有一個名爲列ID_ENTRY在這兩個表中。當我添加一個記錄到表中,條目時,我必須將最後添加的記錄的ID_ENTRY添加到表格標籤中。我該怎麼做?
在第一張表上執行插入語句後,你應該立即查詢@@ IDENTITY做「SELECT @@ identity」。這將檢索最後一個自動生成的ID ...然後將其插入到第二個表中。
如果您使用觸發器或插入行的東西...這可能是行不通的。使用Scope_Identity()代替@@ IDENTITY
如果你有所有需要推送到可用標籤表的數據,我可能會在指定的條目表上使用INSERT觸發器來完成此操作。如果沒有,那麼你可能要考慮使用一個在事務內部創建的存儲過程。
如果你想在代碼中做到這一點,你需要更具體地說明你如何管理你的數據。你在使用DataAdapter,DataTables,LINQ,NHibernate ......嗎?從本質上講,你需要將兩個插入包裝在某種事務中,以便插入可以被執行或者兩者都不會執行,但是要做到這一點取決於你使用什麼技術來與數據庫交互。
要做到這一點的唯一方法是使用多個語句。使用動態SQL您可以在您的查詢字符串用分號分隔每個語句做到這一點:
"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
確保你把這個交易,以防止併發問題,並保持它的所有原子。如果你願意的話,你也可以把它分成兩個單獨的查詢來在中間返回新的ID值;只要確保兩個查詢都在同一個事務中。
另外:你正在使用你的動態sql的參數化查詢,對吧?如果你不是,我會親自過來,用溼麪條舔你10000次,直到你悔改你的不安全的方式。
如果第二次插入失敗,您將希望將這些包裝在事務中。 – tvanfosson 2008-11-24 19:02:43
非常正確。更新以使其更清晰。 – 2008-11-24 19:12:25
如果您使用動態sql,那麼爲什麼不使用Linq to Entity Framework,現在EF是來自Microsoft的推薦數據訪問技術(請參閱此帖來自ADO.NET團隊博客Clarifying the message on L2S Futures),如果您使用EF進行插入,最後的身份ID將自動提供給您,所以我一直使用它很容易。
希望這會有所幫助!
Ray。
感謝您的處理,但我從未使用過存儲過程或觸發器。我在我的項目中使用動態sql,如果有辦法用動態sql做到這一點,它會更好。 – mavera 2008-11-24 18:48:46