.NET Tip #30: Jak v SqlDataSource zjistit ID právě vloženého záznamu

Tomáš Herceg       14.06.2009       SQL, ASP.NET/IIS, Databáze       11122 zobrazení

Často v ASP.NET aplikacích máme nějakou stránku, na které se v databázi zakládají nové záznamy. V databázi záznamy identifikujeme většinou pomocí čísla nebo pomocí guidu a někdy potřebujeme ID právě přidaného záznamu získat, abychom podle toho mohli udělat další akci.

Máme např. stránku Objednavka.aspx, která umožňuje vkládat nové záznamy. Po jeho vložení se chceme třeba přesměrovat ObjednavkaDetail.aspx?id=32, kde 32 je ID objednávky. Jak na to?

1. InsertCommand komponenty SqlDataSource upravte takto, pokud používáte pole typu INT s nastavením IDENTITY(1,1), což je automatická inkrementace.

INSERT INTO [Objednavky] ([Zakaznik], ...) VALUES (@Zakaznik, ...); SELECT @NewId = @@IDENTITY

Pokud používáte GUID, udělejte to nějak takto:

SET @NewId = NEWID(); INSERT INTO [Objednavky] ([Id], [Zakaznik], ...) VALUES (@NewId, @Zakaznik, ...)

2. Do elementu InsertParameters přidejte nový parametr a nastavte mu směr na InputOutput. Pokud používáte INT, bude to vypadat takto:

<asp:Parameter Name="NewId" Type="Int32" Direction="InputOutput" />

Pokud GUID, pak takto:

<asp:Parameter Name="NewId" Size="100" Direction="InputOutput" />

3. V události SqlDataSource_Inserted najdete ID v:

Kód v jazyce Visual Basic .NET
e.Command.Parameters("@NewId").Value
Kód v jazyce C#
e.Command.Parameters["@NewId"].Value

A to je celé. Pochopitelně by bylo lepší, pokud si na to uděláte v databázi proceduru, tyhle dotazy jsou již trochu komplikovanější.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: .NET Tip #30: Jak v SqlDataSource zjistit ID právě vloženého záznamu

Ahoj a promiň, že zase prudím ;-) IMHO je @@IDENTITY ta nejhorší varianta. Když máš na INSERT např. pověšené nějaké triggery, které něco insertují do jiných tabulek, tak to dokáže vracet zajímavé hodnoty ;-)

Mnohem více se mi líbí SCOPE_IDENTITY(), která je omezená aspoň na aktuální scope:

INSERT INTO [Objednavky] ([Zakaznik], ...) VALUES (@Zakaznik, ...); SELECT @NewId = SCOPE_IDENTITY()

Ale vůbec nejlepší řešení je IMHO použití příkazu OUTPUT (od 2005 výše):

INSERT INTO [Objednavky] ([Zakaznik], ...) OUTPUT INSERTED.Id AS NewId VALUES (@Zakaznik, ...)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za doplnění. Ty SQL dotazy si každý musí už upravit podle své databáze, nicméně tohle je článek pro začátečníky, tak jsem moc nepředpokládal, že budou mít v databázi triggery.

Obecně triggery nemám moc rád, protože v 99% procentech případů se dají řešit jinak (např. procedurami) a navíc při větších insertech nebo deletech dosti zpomalují.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já ještě s úspěchem používám:

SELECT @NewId = IDENT_CURRENT('Objednavky')

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to je ještě horší řešení než @@IDENTITY, protože pokud vám někdo insertne mezi vaším insertem a zavoláním ident_current, dostanete to cizí ID.

Pěkný článek o tom vyšel zde:

http://knowledge-base.havit.cz/sql/IDENT...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já jsem to spíše bral tak, aby byl výčet možností zjištění identity kompletní. Pro tento příklad je to samozřejmě nejhorší možnost, jak jste již napsal.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback