08.08.2015, Vladimír Klaus, navštíveno 5524x

ASP.NET/C#
SQL
SQL Server

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