ID Record appena inserito

lunedì 10 gennaio 2011 - 12.25
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010  |  SQL Server 2008  |  Access (.mdb)

luka82 Profilo | Junior Member

Devo fare 3 INSERT in 3 Tabelle diverse. Nella prima ho il campo contatore(ID) e nelle altre due vado a salvare questo ID in modo da avere il riferimento. Io faccio così
Subito dopo la INSERT nella prima tabella faccio:
...
cmd.CommandText = "SELECT @@IDENTITY FROM Tabella1"
Dim Tmp As Integer = CInt(cmd.ExecuteScalar)
...
e poi nelle altre due uso il valore che ho recuperato dell'ID dell'ultimo record che ho inserito nella prima tabella.
A parte che questo metodo funziona solo su ACCESS(che attualmente uso), ma poi in caso di multiutenza? rischio di prendere l'ID che ha inserito nel frattempo un altro utente!?
esiste soluzione migliore e magari valida anche per SQL Server?
Ciao

darkeric Profilo | Senior Member

potresti aggiungere un campo che specifica l'utente in modo poi da poter filtrare anche quello

alexmed Profilo | Guru

>e poi nelle altre due uso il valore che ho recuperato dell'ID
>dell'ultimo record che ho inserito nella prima tabella.
>A parte che questo metodo funziona solo su ACCESS(che attualmente
>uso), ma poi in caso di multiutenza? rischio di prendere l'ID
>che ha inserito nel frattempo un altro utente!?
>esiste soluzione migliore e magari valida anche per SQL Server?
>Ciao

Ciao
gurda qui: http://msdn.microsoft.com/it-it/library/ms190315(v=SQL.100).aspx

cmd.CommandText = "INSERT INTO ....... ;SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
Dim Tmp As Integer = CInt(cmd.ExecuteNonQuery)

In Tmp avrai l'ultimo ID inserito che userai per le INSERT sulle altre due tabelle.

Fammi sapere

alexmed

luka82 Profilo | Junior Member

Con Access mi restituisce "Caratteri non previsti dopo la fine dell'espressione SQL", forse funziona solo con SQL Server?

darkeric Profilo | Senior Member

credo proprio di si

luka82 Profilo | Junior Member

>potresti aggiungere un campo che specifica l'utente in modo poi da poter filtrare anche quello

Potresti spiegarmi bene cosa intendi?

darkeric Profilo | Senior Member

nella tabella della prima insert che effettui aggiungi un campo stringa
nella prima insert aggiungi un valore univoco che non necessariamente dee essere il nome dell'utente che stà effettuando la insert stessa
puoi utilizzare per esempio la GUID che genera una stringa univoca
a quel punto esegui una query di select utilizzando quel campo come filtro e prendi l'ID dell'ultima riga

sicuramente ci sarà un modo più logico ma cosi dovrebbe funzionarti!

luka82 Profilo | Junior Member

>nella tabella della prima insert che effettui aggiungi un campo
>stringa
>nella prima insert aggiungi un valore univoco che non necessariamente
>dee essere il nome dell'utente che stà effettuando la insert
>stessa
>puoi utilizzare per esempio la GUID che genera una stringa univoca
>a quel punto esegui una query di select utilizzando quel campo
>come filtro e prendi l'ID dell'ultima riga
>
>sicuramente ci sarà un modo più logico ma cosi dovrebbe funzionarti!
>
Vorrei vedere se esiste un metodo nativo, mi pare strano che Access non permetta una cosa del genere. Adesso sto provando con ad usare un'unica Transaction tra la prima INSERT e le altre due e in mezzo, per ottenere l'ID creato dalla prima INSERT uso "SELECT @@IDENTITY FROM Tabella1"
vi terrò aggiornati.

alexmed Profilo | Guru

Ciao
Nel post precedente avevo capito che volevi passare a SQL Server.
Per Access leggi qui: http://support.microsoft.com/kb/816112/it

Ciao

alexmed

luka82 Profilo | Junior Member

La mia intenzione è quella di trovare un metodo funzionante sia con ACCESS che con SQL SERVER in modo da avere due versioni del mio programma (attualmente uso solo ACCESS).
Il dubbio mi sorgeva pensando al caso in cui due o più utenti, contemporaneamente, cliccavano dalle rispettive postazioni sul tasto salva, come si sarebbe comportata la query "SELECT @@IDENTITY"?
Ho fatto delle prove ed "ho scoperto" che se uso un'unica transaction per tutte le query è come se mi bloccasse quella tabella per tutto il tempo necessario per effettuare tutte le query e fare la Commit, e, se un altro utente clicca sul tasto salva gli da errore "...attualmente bloccato..."(o simile, adesso non ricordo). Invece se non uso la transaction non da nessun messaggio ma la "SELECT @@IDENTITY" si comporta "bene" cioè da l'ID subito successivo(anche se le query inviate da una postazione non sono ancora finite).
L'inconveniente del messaggio che da' in caso di utilizzo della Transaction penso sia ben ripagato dal fatto che faccio la INSERT sulle tre tabelle solo se vanno a buon fine.
In definitiva penso di utilizzare la Transaction unica per le tre Query e utilizzo "SELECT @@IDENTITY"(utilizzando un OleDbCommand diverso da quello che si usa per la prima INSERT) per ottenere l'ultimo ID inserito.
Spero di essere stato chiaro nello spiegare la mia esperienza, se qualcuno ha qualche suggerimento è ben accetto.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5