Recuperare un id dopo una insert con Asp.net e Access

martedì 20 gennaio 2009 - 00.51

86Marco Profilo | Expert

Salve, nella mia applicazione ho un modulo che, una volta compilato, inserisce dei dati all'interno di un database.

In particolare uno di questi è un modulo che consente l'anagrafica clienti.
Mi servirebbe, una volta effettuata l'insert sul database Access, recuperare l'id che è stato generato per il cliente appena inserito!
come fare?
Grazie

luxsor Profilo | Guru

Ciao Marco,
se come database avessi SQL Server le cose sarebbere più semplici.
Tramite un Stored Proceduce usufruendo della funzione SCOPE_IDENTITY(), otterresti quello che cerchi.
Visto che il DB è access, ti consiglio una TRANSAZIONE.
Creati una Transazione con all'interno la query per l'inserimento e la query per recuperare ID del cliente appena creato, usando la funzione MAX sull'ID del cliente.

Ciao

gigi90 Profilo | Senior Member

Sia per Access che per SQL Server o MySQL puoi utilizzare l'istruzione:

SELECT @@IDENTITY;
che eseguita subito dopo una istruzione di INSERT restituisce l'ultimo ID Generato.

E importante che questa istruzione viene eseguita sulla stessa connessione del comando INSERT, senno potrebbe restituirti NULL.

Per chiarimenti non esitare a chiedere

86Marco Profilo | Expert

Ok grazie a entrambi, in particolare sapresti postarmi un esempio di codice insert con la clausola @@IDENTITY?
Grazie :)

luxsor Profilo | Guru

La sintassi della query è la seguente:

SET NOCOUNT ON; INSERT INTO tuatabella (colonne1, colonna2) VALUES ('valore1', 'valore2); SELECT @@Identity AS IdRestituito

in base al tipo di linguaggio che stai usando C# o VB.net

estrai dal DATAREADER("IdRestituito")

86Marco Profilo | Expert

ok quindi due semplici domande:
1) Set NOCOUNT nn ricordo a cosa serve... protresti delucidarmi?

2) la select della IDENTITY deve essere nella stessa istruzione sql di Insert?

Grazie mille:)

86Marco Profilo | Expert

Questo è il mio codice:

Dim con As New Data.OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("Database").ToString)
Dim cmd As New Data.OleDb.OleDbCommand("Insert Into articoli(Descrizione, Importo) values(" & "'" & TextBox2.Text & "'," & "'" & TextBox3.Text & "'); Select @@IDENTITY as IDrestituito", con)
con.Open()
Dim reader As Data.OleDb.OleDbDataReader

reader = cmd.ExecuteReader
reader.Read()
Response.Write(reader("IDrestituito"))
reader.Read()
con.Close()

Pero mi da errore... non è che sareste cosi gentili da aiutarmi a trasformarlo nel modo giusto?
Grazie veramente tanto

gigi90 Profilo | Senior Member

Eccoti un esempio adattato al tuo caso che dovrebbe funzionare:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

86Marco Profilo | Expert

Xfetto grazie mille...

A questo punto ti faccio un ultimissima domanda e prometto di non scocciarti +!
Questa procedura è utile quando devo inserire dei valori in una singola tabella, quindi mi recupero l'id che ho inserito.

Ma se devo inserire dei valori su più tabelle, per esempio un ordine, nel quale devo inserire dati in tabelle Clienti, Ordini e Dettagli_Ordini, quale sarebbe la migliore procedura per farlo e per ricavare la nuova identità della sola tabella Ordini?

Spero che saprai rispondermi anche a questa domanda...
Grazie mille

:)

gigi90 Profilo | Senior Member

Basta che chiami il SELECT @@IDENTITY subito dopo l' INSERT INTO Ordini,
infatti @@IDENTITY è una funzione di sistema che restituisce l'ultimo ID generato dopo un istruzione, quindi dopo l'INSERT INTO ORDINI conterrà l' ID generato nella tabella ORDINI ma se chiami un'altra INSER su un'altra tabella questo si aggiornerà con un nuovo eventuale ID creato su una nuova tabelle.

P.S: Se ti ritieni soddisfatto per la spiegazione allora puoi accettare la risposta

86Marco Profilo | Expert

Accetto la risposta... prima però sapresti dirmi come poter gestire le transazioni con access e asp.net?? è possibile? Grazie mille per la cortesia!

luxsor Profilo | Guru

Per implementare una TRANSAZIONE devi usare la proprità BEGINTRANSACTION e COMMIT
Esempio:
'Questo è il codice preso da sopra

Dim con As New Data.OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("Database").ToString)
con.Open()
Dim cmd As New Data.OleDb.OleDbCommand("INSERT INTO articoli(Descrizione, Importo) VALUES (" & "'" & TextBox2.Text & "'," & "'" & TextBox3.Text & "')", con)
'istanza la transazione
dim MyTransaction as OleDbTransaction

'Inizio transazione
MyTransaction=con.BeginTransaction()
cmd.ExecutoNonQuery() 'Esegue il comando di inserimento che non restituisce nulla
cmd.CommandText="SELECT @@IDENTITY as IDrestituito"
Response.Write(cmd.ExecuteScalar().ToString()) 'Execute scalar restitisce la prima colonna della prima riga di una query, siamo nel caso di una SELECT @@IDENTITY

'Fine transazione
MyTransaction.Commit()

con.Close()

gigi90 Profilo | Senior Member

Possibilissimo, basta utilizzare l'oggetto OleDbTransaction, che deve essere inizializzato per mezzo dell'oggetto OleDbConnection un esempio è il seguente:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

86Marco Profilo | Expert

Bene Grazie a tutti e due... molto molto utili.
Grazie mille! ;)
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