Lavorando con ASP ed i database uno dei problemi più comuni riguarda il recupero dell'ID dopo una istruzione di inserimento (tipicamente una INSERT). Lavorando con ACCESS i campi autoincrementanti sono quelli indicati come contatore
, mentre su SQL Server si parla di campi con la proprietà identità
attivata.
Le proprietà di questi campi sono molto semplici, si incrementano automaticamente dopo ogni inserimento e non possono contenere valori duplicati, quindi sono dei candidati ottimi ad essere chiavi primarie delle nostre tabelle.
ADO: i metodi AddNew e Update (Access)
Con ACCESS possiamo recuperare il valore di un campo contatore sfruttando il metodo .Update
dopo un .AddNew
, eseguendo .Update
dopo avere aggiunto un record ADO (.AddNew
) possiamo recuperare l'ultimo ID dal recordset attivato. Qui sotto un esempio:
Set rsUtente = Server.CreateObject("ADODB.Recordset") rsUtente.Open "MyUsers", objConn, adOpenKeyset, adLockPessimistic, adCmdTable rsUtente.AddNew rsUtente("Name") = strName rsUtente("Email") = strEmail rsUtente.Update intpkUID = rsUtente("ID") Set rsUtente = nothing
ADO: Command e Store Procedure (SQL Server)
Lavorando con SQL Server e T-SQL diventa molto più semplice, infatti sfruttando la funzione globale @@IDENTITY
di T-SQL possiamo recuperare l'ultimo valore indentità inserito nella nostra tabella.
Basta avere una tabella con il campo identità attivo, creare la procedura per l'inserimento dei record e recuperare l'ID attraverso un parametro di OUTPUT dalla procedura, vediamo il codice qui sotto:
CREATE PROCEDURE P_InserisciUtente
@name nvarchar(50) = '',
@email nvarchar(70) = '',
@password nvarchar(50) = '',
@UserID int OUTPUT
AS
INSERT INTO Users (name,email,password)
VALUES (@name,@email,@password)
SELECT @UserID = @@IDENTITY -- recupero l'ID
Dopo aver creato la procedura, creiamo la pagina ASP per richiamarla e recuperare l'ID appena inserito:
'Creo ADO Command Object Set objCmd = Server.CreateObject("ADODB.Command") objCmd.ActiveConnection = objConn ' connessione al DB objCmd.CommandText = "P_InserisciUtente" ' nome della procedura objCmd.CommandType = adCmdStoredProc ' definisco il tipo di comando 'Aggiungo I parametri di input alla collezione dei parametri Set param = objCmd.CreateParameter ("name", adVarWChar, adParamInput, 50, "Luca") objCmd.Parameters.Append param Set param = objCmd.CreateParameter ("email", adVarWChar, adParamInput, 50, "info@lucamilan.it") objCmd.Parameters.Append param Set param = objCmd.CreateParameter ("password", adVarWChar, adParamInput, 50, "miapwd") objCmd.Parameters.Append param 'Aggiungo anche il parametro di output alla collezione dei parametri Set param = objCmd.CreateParameter ("UserID", adInteger, adParamOutput) objCmd.Parameters.Append param 'eseguo la procedura via ADO con il metodo .execute() objCmd.Execute 'Recupero il valore dell'ID appena inserito Response.Write objCmd.Parameters("UserID")