Id record

sabato 25 novembre 2006 - 17.27

tecnovico Profilo | Junior Member

Cia a tutti raga.... Volevo sapere come fare ad ottenere l'id di un record appena creato.

alx_81 Profilo | Guru

>Cia a tutti raga....
Ciao!

>Volevo sapere come fare ad ottenere l'id
>di un record appena creato.

Ciao tecnovico..
non indichi che DBMS utilizzi..
e soprattutto non sembra sia la stanza corretta.. sei un po' OT..
però, se intendi SQL server, basta utilizzare @@IDENTITY o SCOPE_IDENTITY, che ti ritornano l'id autoincrementante appena creato.
Ma attenzione, mentre @@IDENTITY non sempre ritorna l'id della tabella in cui hai appena inserito il record, SCOPE_INDENTITY restituisce il valore a cui è arrivata la colonna identity SOLO nell'ambito corrente.
Mi spiego..
Se la tabella di cui vuoi sapere il valore di colonna identity ha trigger che incrementano altre colonne identity, @@IDENTITY restituisce l'ultimo degli id incrementati. SCOPE_IDENTITY, in questo caso, restituisce solo l'identity della tabella sulla quale hai eseguito l'INSERT effettiva (la prima)
.
Ma eccoti un esempio (che va bene sia per SQL Server 2000 che per 2005):

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

http://blogs.dotnethell.it/suxstellino

totti240282 Profilo | Guru

quella però è una sp vero ??
C'è solo un capitano !!!!!!

totti240282 Profilo | Guru

quella però è una sp vero ??
C'è solo un capitano !!!!!!

alx_81 Profilo | Guru

>quella però è una sp vero ??

no.. è uno script t-sql.. perchè?

Alx81 =)

http://blogs.dotnethell.it/suxstellino

tecnovico Profilo | Junior Member

Utilizzo microsoft sql server 2005.
Non ho capito bene quello che mi hai detto anche perche mi aspettavo un metodo da codice per esempio dataset.qualche_metodo.
Mi hai indicato una stored procedure, potresti spigarmi quello che fa? e come usarla?
Oltre questo, se creo la stored procedure e la eseguo (non so come per ora) siamo sicuri che torna l'ultimo id creato? Mi spiego meglio: io utilizzo una classe per effettuare i mie inserimenti nel database,dopo dovrei lanciare la SP per ricavare l'id del record ma se un altro utente della applicazione web nel frattempo inserisce un record?
Grazie.

alx_81 Profilo | Guru

>Utilizzo microsoft sql server 2005.
>Non ho capito bene quello che mi hai detto anche perche mi aspettavo
>un metodo da codice per esempio dataset.qualche_metodo.
>Mi hai indicato una stored procedure, potresti spigarmi quello
>che fa? e come usarla?
ti ho chiesto che DBMS usi perchè non lo indicavi e quindi non sapevo che sintassi presentarti
Poi, questa non è una stored procedure, è un semplice statement T-SQL. Può essere messo in una stored procedure (Anzi sarebbe meglio) ma non la è ..

>Oltre questo, se creo la stored procedure e la eseguo (non so
>come per ora) siamo sicuri che torna l'ultimo id creato? Mi spiego
>meglio: io utilizzo una classe per effettuare i mie inserimenti
>nel database,dopo dovrei lanciare la SP per ricavare l'id del
>record ma se un altro utente della applicazione web nel frattempo
>inserisce un record?
Il problema sta proprio lì.. il metodo che fa "INSERT" dovrebbe lanciare una stored procedure, la quale, oltre che fare l'insert ti torna l'id appena inserito.. altrimenti non puoi, come giustamente dici tu, avere visibilità sul corretto id da ricavare.. sicuramente devi avere tutto sotto la stessa transazione.. scusami, ma l'ho dato come cosa sottointesa, errore mio..

Quindi ti consiglio di modificare la tua classe in modo che l'inserimento lanci una sp fatta seguendo il seguente modello:

ALTER PROCEDURE proc_InsertIntoMyTable ( @campo1 varchar(50), @idres int = NULL output ) AS BEGIN BEGIN TRAN INSERT INTO dbo.TabellaIdentity VALUES(@campo1) SET @idres = SCOPE_IDENTITY() COMMIT TRAN END

A questo punto, nel tuo codice, dovrai indicare che il tipo del comando che usi è StoredProcedure..
Nel commandText il nome della procedura, nel secondo parametro dovrai indicare che è di Inputoutput e il metodo di esecuzione sarà ExecuteNonQuery. Subito dopo l'esecuzione dovrai controllare il valore del parametro di output, e lì avrai il valore dell'id iserito..
Spero di essere stato chiaro..


>Grazie.
Di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

tecnovico Profilo | Junior Member

E' la prima volta che uso una stored procedure... ora vedo come si crea e poi utilizzarla seguendo quello che mi hai detto:

"A questo punto, nel tuo codice, dovrai indicare che il tipo del comando che usi è StoredProcedure..
Nel commandText il nome della procedura, nel secondo parametro dovrai indicare che è di Inputoutput e il metodo di esecuzione sarà ExecuteNonQuery. Subito dopo l'esecuzione dovrai controllare il valore del parametro di output, e lì avrai il valore dell'id iserito.."

potresti postare il codice del metodo public int insert(String campo1,String campo2...){return idRow}?

ps: cosa si intende per l'istruzione Transact-SQL ?

alx_81 Profilo | Guru

>potresti postare il codice del metodo public int insert(String
>campo1,String campo2...){return idRow}?

supponiamo di avere la tabella definita prima, quella con un campo id identity e la descrizione varchar(50):

Creazione della stored procedure:

CREATE PROCEDURE proc_InsertIntoMyTable ( @campo1 varchar(50), @idres int = NULL output ) AS BEGIN BEGIN TRAN INSERT INTO dbo.TabellaIdentity VALUES(@campo1) SET @idres = SCOPE_IDENTITY() COMMIT TRAN END

Codice C#:

using System.Data.SqlClient; public int insert (string campo1) { SqlConnection sqlConn = new SqlConnection(tuaconnstring); sqlConn.Open(); SqlCommand sqlCmd = sqlConn.CreateCommand(); sqlCmd.CommandText = "proc_insertIntoMyTable"; sqlCmd.CommandType = CommandType.StoredProcedure; sqlCmd.Parameters.Add("@campo1",SqlDbType.VarChar,50); sqlCmd.Parameters.Add("@idres",SqlDbType.Int); sqlCmd.Parameters["@idres"].Direction = ParameterDirection.InputOutput; sqlCmd.Parameters["@campo1"].Value = campo1; sqlCmd.ExecuteNonQuery(); return Int32.Parse(sqlCmd.Parameters["@idres"].Value.ToString()); if (sqlConn.State != ConnectionState.Closed) { sqlConn.Close(); } }

>ps: cosa si intende per l'istruzione Transact-SQL?
un'istruzione transact-sql (o t-sql) è un'istruzione scritta appunto in linguaggio t-sql, il quale può essere definito come un'estensione del linguaggio sql standard, programmabile e con la possibilità di effettuare operazioni molto più complesse che i semplici statement consentono. E' un "linguaggio di programmazione" utile alla gestione del db ed alla interazione verso il db.
Si possono eseguire cicli, utilizzare variabili, e quant'altro, in maniera del tutto simile ad un linguaggio di programmazione.
Consulta comunque i books online di sql server, troverai documentazione a riguardo..
ciao!

E credimi, usa le stored procedure..
leggi anche cosa si dice in questo link:

http://blogs.ugidotnet.org/nettools/archive/2006/11/12/54508.aspx





Alx81 =)

http://blogs.dotnethell.it/suxstellino

totti240282 Profilo | Guru

oppure se vuoi usare una semplice query puoi fare cosi


"insert into.......;select @@scope_identity"
e ti ritorna l'id inserito.
C'è solo un capitano !!!!!!

tecnovico Profilo | Junior Member

grazie alx_81
Raga siete fantastici!!!

tecnovico Profilo | Junior Member

ora che ci penso, il fatto che io esegua una transazione esclude che ci sia conconrennza? la transazione garantisce o che tutto vada bene o che ci sia un ripristiono dello stato. per eliminare la concorrenza ci vorrebbe un lock sulla tabella....

alx_81 Profilo | Guru

>ora che ci penso, il fatto che io esegua una transazione esclude
>che ci sia conconrennza? la transazione garantisce o che tutto
>vada bene o che ci sia un ripristiono dello stato. per eliminare
>la concorrenza ci vorrebbe un lock sulla tabella....

La concorrenza potrebbe esserci..
ma l'identity è quello tornato nello scope della transazione, nessun rischio di intercettare quello inserito da chiunque altro..

Alx81 =)

http://blogs.dotnethell.it/suxstellino
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