Recuperare l'ID dell'ultimo record inserito senza usare SP

mercoledì 02 maggio 2007 - 09.19

tetacom Profilo | Newbie

Salve a tutti,
ho un quesito da porre in merito all'argomento in oggetto.
Ho la mia brava tabella in sql server 2005 con un campo identità che fa da chiave primaria. (e fin qui non ci nevica)
Sto creando un'applicazione winform con vbasic ed utilizzo, as usual, i 2 oggetti che mi crea la procedura guidata:
- DataSet
- TableAdapter

E fin qui neanche ci nevica. Io ho intenzione di aggiungere un nuovo record nella tabella utilizzando il metodo Insert esposto dall'oggetto TableAdapter e voglio recuperare immediatamente l'ID automatico che gli è stato assegnato dal mio bravo SQL Server.

Ho letto che si può fare con le stored procedure, ma ho la stessa esigenza per una quarantina di tabelle e sinceramente non mi va di scrivere 40 stored procedure. Nella configurazione guidata del TableAdapter c'è una casella di spunta "Aggiorna la tabella dati" nella schermata "Opzioni Avanzate": quello che mi chiedo io è:

POSSO UTILIZZARE QUESTA PROCEDURA AUTOMATICA E VELOCE PER RAGGIUNGERE IL MIO OBIETTIVO SENZA SCRIVERE UNA STORED PROCEDURE?

oppure

SAPETE SUGGERIRMI UN METODO VELOCE?

Grazie anticipatamente!


TetaCom
Ci sono 10 categorie di persone: chi comprende il sistema binario e chi non lo comprende.

Brainkiller Profilo | Guru

>Ho letto che si può fare con le stored procedure, ma ho la stessa
>esigenza per una quarantina di tabelle e sinceramente non mi
>va di scrivere 40 stored procedure. Nella configurazione guidata
>del TableAdapter c'è una casella di spunta "Aggiorna la tabella
>dati" nella schermata "Opzioni Avanzate": quello che mi chiedo

Prova a leggerti questo Post, forse è ciò che serve a te.
Fammi sapere.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

tetacom Profilo | Newbie

Scusa David,

ma a quale post ti riferisci?



TetaCom
Ci sono 10 categorie di persone: chi comprende il sistema binario e chi non lo comprende.

Brainkiller Profilo | Guru

>Scusa David,
>ma a quale post ti riferisci?

Porca miseria, mi è rimasto nella clipboard il link. Eccolo:
http://blogs.msdn.com/smartclientdata/archive/2005/10/31/ReturnIdentityValueQuery.aspx
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

lbenaglia Profilo | Guru

>Porca miseria, mi è rimasto nella clipboard il link. Eccolo:
>http://blogs.msdn.com/smartclientdata/archive/2005/10/31/ReturnIdentityValueQuery.aspx

Il tuo amico dev ha commesso una leggerezza
Se sulla tabella dbo.Orders è definito un trigger che esegue una insert in un'altra tabella che possiede una colonna IDENTITY, il risultato che otterrà sarà il valore generato per la seconda dabella dato che lo scope della funzione @@IDENTITY è a livello di sessione.
La soluzione consiste nell'utilizzare la funzione SCOPE_IDENTITY() che invece ha uno scope a livello di procedura corrente.

I Books Online sono chiarissimi in merito alle funzioni @@IDENTITY, SCOPE_IDENTITY() e IDENT_CURRENT():

"@@IDENTITY (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms187342.aspx

"SCOPE_IDENTITY (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms190315.aspx

"IDENT_CURRENT (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms175098.aspx

Ah, dimenticavo, è una PESSIMA IDEA accedere direttamente ad un oggetto di un db senza passare da un layer costituito da stored procedure, UDF e viste, per motivi di SICUREZZA, prestazioni ed astrazione dallo schema del db.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

tetacom Profilo | Newbie

Ragazzi siete stati fantastici, ho tanto materiale da leggere e studiare. Mi avete dato ottimi spunti da approfondire: GRAZIE!!!

Ritornando al problema: l'ho risolto e adesso vi dico come:
- apro la finestra di progettazione del dataset generato automaticamente dal VStudio
- ogni table ha il suo TableAdapter
- clicco col destro sul TableAdapter e seleziono Aggiungi Query
- parte la Configurazione Guidata Query
- seleziono Crea Nuova Stored Procedure

- come per magia mi porta alla creazione di una Stored Procedure di tipo Insert alla quale ci posso aggiungere @@IDENTITY oppure SCOPE_IDENTITY(), modificando un pochino quello che mi passa la creazione guidata.

Comunque un'operazione meccanica che per 40 tabelle non mi porterà via un'eternità di tempo.

Ho provato con @@IDENTITY e con SCOPE_IDENTITY(): funziona in tutti e due i casi restituendo l'ID dell'ultimo record inserito.

Lorenzo in questo modo ho risolto i problemi di sicurezza, prestazioni ed astrazione a cui ti riferivi?



TetaCom
Ci sono 10 categorie di persone: chi comprende il sistema binario e chi non lo comprende.

lbenaglia Profilo | Guru

>Ho provato con @@IDENTITY e con SCOPE_IDENTITY(): funziona in
>tutti e due i casi restituendo l'ID dell'ultimo record inserito.
Peché la tua tabella non ha un trigger di insert che esegue a sua volta una INSERT su una seconda tabella avente una colonna IDENTITY

>Lorenzo in questo modo ho risolto i problemi di sicurezza, prestazioni
>ed astrazione a cui ti riferivi?
Io mi limito a dire che un accesso corretto comporta la definizione di un layer costituito dagli oggetti che ho menzionato nel precedente post.

Tanto per avere un assaggio dei vantaggi che comportano le stored procedure, leggi i seguenti post:
http://tinyurl.com/s662
http://tinyurl.com/s664

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

tetacom Profilo | Newbie

OK Lorenzo, ci darò un'attenta lettura. Sto migrando da access a sql server e mi ritrovo a gestire gli stessi dati di prima, ma con un metodo differente. Per adesso mi trovo abbastanza a mio agio con sql server, ma ho ancora tanto da imparare sia in teoria che sul campo pratico. Vi ringrazio e se ho altri problemi aprirò altri post! :D



TetaCom
Ci sono 10 categorie di persone: chi comprende il sistema binario e chi non lo comprende.
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5