Come creare id progressivo univoco senza utilizzare l' id contatore au...

mercoledì 12 novembre 2008 - 22.02

roddik1980 Profilo | Junior Member

Ciao a tutti,

ho una applicazione creata con ASP.net 2.0 alla quale molti utenti della mia organizzazione accedono "CONTEMPORANEAMENTE" per inserire le spedizioni che realizziamo con diversi vettori.
Il database l' ho creato con MS SQL Server 2005.

Ogno volta che un utente inserisce una nuova spedizione nella tabella del db si deve generare anche un NUMERO DI SPEDIZIONE che deve essere univoco e progressivo, va bene un numero......

Alla fine dell' inserimento l' utente che l' ha inserito deve ricevere un messaggio sotto forma di report / pagina web ecc. col dettaglio della spedizione appena inserita e il relativo NUMERO DI SPEDIZIONE univoco e progressivo appena creato.

Come posso fare ?
Se uso l' autoincrement di MS SQL Server 2005 e un utente genera e poi cancella la spedizione viene saltato un numero progressivo ! Non voglio questo, voglio che da 1 ad infinito i NUMERI DI SPEDIZIONE progressivi facciano sempre riferimento ad una spedizione esistente.

Mi date dei consigli e degli esempi pratici, per favore ?!

Grazie

Mark

rossimarko Profilo | Guru

Ciao,

puoi sempre salvarti su database un campo NumeroSpedizione e ogni volta che crei un nuovo record vai a calcolare il valore da inserire facendo una MAX(NumeroSpedizione) + 1.
Io ti consiglio di tenere l'autoincrementante come chiave identificativa del record, mentre il numero di spedizione diventa un attributo. Così se per caso un domani dovesse cambiare la logica (ad esempio si deve riazzerare nell'anno) non devi stravolgere il tutto
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

roddik1980 Profilo | Junior Member

Ok, grazie.

1) Già valutatata la soluzione "MAX(NumeroSpedizione) + 1" la quale però decade e non è sicura al 100% se accedono contemporaneamente + utenti !

2) Credo a questo punto sia più corretto e sicuro tenere l' autoincrementale come dici tu.
Ora però ho il seguente problema, come faccio a farmi restituire l' id appena creato (autoincrement) dall' utente subito dopo l' INSERT della spedizione ?
Come si recupera ?

Grazie e buona giornata.

Mark

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao, scusate se intervengo..

>Ogno volta che un utente inserisce una nuova spedizione nella
>tabella del db si deve generare anche un NUMERO DI SPEDIZIONE
>che deve essere univoco e progressivo, va bene un numero......
>Come posso fare ?
Innanzitutto, quoto rossimarko perchè l'identity come chiave è utilissima nel tuo caso.
Per Il numero di spedizione invece potresti pensare di simulare la tecnica usata per creare gli identity di sql server.
Ad ogni inserimento, potresti salvarti già il prossimo numero di spedizione su una ulteriore tabella.
Poi, tutte le volte che vai ad aggiungere record, vai a leggere il numero precedentemente salvato, facendo attenzione a non dare accesso ad altri utenti fino a che l'insert finale non è committata. Solo allora, aggiorni il campo nella tabellina di appoggio (+1) e lasci il via libera.
Ora, questo ha un rovescio della medaglia. Poichè ogni utente ha alla fine un accesso esclusivo e solo quando esso ha terminato l'inserimento viene rilasciata la risorsa..
Se non hai un traffico veramente imponente, puoi farlo senza problemi..

Intanto che ci sono, ti rispondo anche alla seconda domanda:

SCOPE_IDENTITY
http://technet.microsoft.com/it-it/library/ms190315.aspx

>Grazie
Di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5