zjištění čísla následujícího čísla Identity specification   zodpovězená otázka

ASP.NET WebForms

Zdravím, používám sql databázi sqlexpress a sloupec id se plní automaticky, protože mám nastaveno Identity specification na Yes a inkrementaci o 1. Potřeboval bych zjistit jaké číslo je poslední, respektive které se se vloží při insertu záznamu, jde to nějak? Zkoušel jsem to tak, že jsem vyselectoval poslední číslo id, to funguje až na jeden případ, kdy v databázi není žádný záznam (nějaký tam již byl a smazal se) a proto mi to vyselectuje 0 ikdyž následující číslo je vyšší. Díky za rady.

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

Tohle řešení nepoužívejte, pokud budete k databázi přistupovat sám tak to fungovat bude, pokud ale bude přihlášeno více uživatelů, může se lehce stát že si tímto způsobem "vygenerujtete" číslo ale ve finále ho získá záznam vložený uplně jiným uživatelem.

Pokud používáte stored procedury, tak ID právě vloženého záznamu získáte takto:

DECLARE @posledniID INT

SET @posledniID=(SELECT SCOPE_IDENTITY())

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

Já ho ale potřebuji zjistit v metodě ItemInserting, takže pokud se nemýlím, tak by se nemělo stát že ho použije jiný uživatel. V oraclu jde do sekvencí jednoduše přistupovat a zjistit následující číslo právě dané sekvece, ne vyselectováním posledních záznamů, proto mě zajímá jestli to jde nějak podobně i v mssql.

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

Pokud používáte SqlDataSource, dotaz by měl vypadat takto:

 INSERT INTO ... VALUES (...); SELECT @newId = SCOPE_IDENTITY() 

Datovému zdroji přidejte InsertParameter @newId a nastavte mu Direction na InputOutput.

Hodnotu pak zjistíte v události ItemInserted mrknutím do kolekce parametrů.

V SQL Serveru jsou 3 funkce, kterými ID posledně vloženého záznamu můžete zjistit:

- IDENT_CURRENT('tabulka') je nejméně často používaná metoda, protože vrací skutečné poslední ID v tabulce, takže při současném přístupu více uživatelů vám vrátí kraviny.

- @@IDENTITY vrací posledně vložené ID v rámci SQL spojení, tzn. ostatní uživatelé vás neovlivní. Máte-li ale na tabulce, do které vkládáte, trigger, a pokud v něm vkládáte jiný záznam, dostanete ID záznamu z toho triggeru.

- SCOPE_IDENTITY dělá přesně to, co je potřeba - vrátí ID naposledy vloženého záznamu v kódu, který spouštíte (tzn. nebude vracet ID z triggeru, i když se spustil), a opět funguje v rámci spojení, tzn. ostatní uživatelé ho nemají šanci ovlivnit.

Metoda zjištění následujícího čísla je oproti tomu horší, protože buď to to číslo jenom vrátí (a tím pádem musíte dávat pozor na přístup více uživatelů, což je potíž), anebo to vrátí nové ID a provede inkrementaci. Pokud ale aplikace často zjišťuje nová IDčka (a že jsem takových už viděl), stašně se jimi plýtvá (viděl jsem aplikaci, která z 10000 vygenerovaných IDček použila asi jedno) a za den to počítadlo vzrostlo o několik milionů. A velikost INTu jsou jen 4 miliardy, že...

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

Měl bych jeden zvídavý dotaz, co se dělo s těma ostatníma z 10 000 ID která aplikace načítala? Resp. proč načítala tolik ID když je pak zahazovala? Nedokážu si totiž představit praktické využití něčeho takového.

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

Při otevření okna pro založení záznamu si vygenerovala nové IDčko a když uživatel klikl na Storno, už ho nebylo jak vrátit. Ale bylo tam toho víc.

Proč to tak dělali nevím, já tu aplikaci nepsal, jen jsem do ní doplnil dva řádky, když padala.

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.
  • 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