08.08.2015, Vladimír Klaus, navštíveno 5499x
Pokud programujete v ASP.NET a pracujete například s SQL Serverem nebo i jen jeho odlehčenou CE variantou, pak asi velice brzy objevíte, že se k ID naposledy vloženého záznamu dostanete níže uvedeným příkazem. Tomu pochopitelně předchází nějaký ten INSERT do databáze.
IdZaznamu = (int)db.GetLastInsertId();
A bude vám to velmi dobře fungovat, ale jen pokud nebude k databázi nebo různým tabulkám přistupovat příliš mnoho lidí najednou. Proč? Ono to z výše uvedeného příkazu není přímo patrné, ale díky němu získáte ID naposledy vloženého záznamu v celé databázi. O nějaké aktuální či Vámi naposledy použité tabulce tu není řeč!
Jenže to není jediný problém, který vám může zjištování ID zkomplikovat. I když pracujete sami, lokálně, nemusí výše uvedený příkaz fungovat. Na vině může být trigger, který třeba hlídá, když vložíte do tabulky nějaký záznam a pak o tomto vloží záznam do logovací tabulky. Díky tomu získáte ID vloženého záznamu z logovací tabulky, do které se zapíše až po zápisu do vaší tabulky.
Po dalším pátrání narazíte na hojně doporučovaný příkaz, jenže se opět zapomíná, že se jedná o celou databázi a nikoliv tabulku, se kterou pracujete. A navíc opět vstupuje do hry i trigger.
SELECT @@IDENTITY
Co tedy s tím? Zapomeneme na vše výše uvedené a zkusíme použít něco jiného. Dříve se používalo a nelze proti tomu téměř nic namítnout ani nyní.
SELECT MAX(ID) FROM Tabulka
A nebo moderněji třeba takto:
SELECT IDENT_CURRENT('Tabulka')
Bohužel to není stále 100%, protože i zde mohlo dojít k tomu, že záznam vložil někdo jiný a ne vy. Nebo jste mezitím přidali další trigger, který přidává záznamy přímo do této tabulky a opět můžete dostat jiné ID.
Autor níže uvedeného článku proto doporučuje toto, ale jak vidíte, opět jde o celou databázi, i když v tomto případě se triggery nebo případné uživatelské funkce ignorují.
SELECT SCOPE_IDENTITY()
Je tu ještě jeden a dle mého jediný bezpečný způsob, jak zjitstit ID záznamu, který jste právě vložili. Do tabulky přidáte pole pro GUID a při INSERTU si takové GUID vygenerujete, zapamatujete a vložíte. A pak se už jen zeptáte takto:
SELECT ID FROM Tabulka WHERE GUID='vaše GUID'
Možná to není úplně nejelegantnější řešení, ale když bude nejhůř, můžete k němu sáhnout.
Není to legrace, že? Takže hledejte, čtěte, testujte a rozhodujte se podle vaší situace!
Více info třeba v tomto pěkně shrnujícím článku od Pinal Dave:
http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/
A pochopitelně musím doporučit i rozsáhlý článek od Mika Brinda:
http://www.mikesdotnetting.com/article/54/getting-the-identity-of-the-most-recently-added-record