Campo con autoincrement: in che modo?

martedì 05 settembre 2006 - 16.14

Giovanni_3478 Profilo | Senior Member

Ciao


DA Visual Studio ho creato una tabella
e ho creato un campo di tipo int con chiave primaria.

Vorrei che questo campo funzionasse da contatore
e che quindi il valore di questo campo si autoincrementasse
quando si inseriscono valori negli altri campi.

Come è possibile ottenere questo risultato?

lbenaglia Profilo | Guru

>DA Visual Studio ho creato una tabella
>e ho creato un campo di tipo int con chiave primaria.
>
>Vorrei che questo campo funzionasse da contatore
>e che quindi il valore di questo campo si autoincrementasse
>quando si inseriscono valori negli altri campi.
>
>Come è possibile ottenere questo risultato?

Con che DBMS?
In SQL Server è sufficiente definire l'attributo IDENTITY specificando il seme ed il fattore di incremento.

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

Ciao!

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

Giovanni_3478 Profilo | Senior Member

Grazie mille

Giovanni_3478 Profilo | Senior Member

ho fatto delle prove settando
da Visual Studio "Specifica Identità"

Bene ho provato a fare degli insert con un DetailsView
e l'id non viene incrementato.

Credo che bisogna aggiungere
SET IDENTITY_INSERT nome_tabella ON
...
nella query dell'SqlDataSource,
giusto?

Qual' la sintassi precisa?

La mia insert è la seguente
>InsertCommand="INSERT INTO background_image(id_immagine, nome_immagine, background_image, [768Px], [1000Px]) VALUES (@id_immagine, @nome_immagine, @background_image, @768Px, @1000Px)"

lbenaglia Profilo | Guru

>Credo che bisogna aggiungere
>SET IDENTITY_INSERT nome_tabella ON

Ciao Giovanni,

no, SET IDENTITY_INSERT nome_tabella ON serve per forzare un valore esplicito in una colonna con l'attributo IDENTITY.

"SET IDENTITY_INSERT"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_set-set_7zas.asp

>La mia insert è la seguente
>InsertCommand="INSERT INTO background_image(id_immagine, nome_immagine, background_image, [768Px], [1000Px]) VALUES (@id_immagine, @nome_immagine, @background_image, @768Px, @1000Px)"

Devi semplicemente lasciare che la colonna IDENTITY venga incrementata autonomamente, pertanto occorre escluderla da tuo comando di insert. Presumo che nel tuo caso si tratti della colonna id_immagine, quindi il comando di INSERT corretto sarà:

InsertCommand="INSERT INTO background_image(nome_immagine, background_image, [768Px], [1000Px]) VALUES (@nome_immagine, @background_image, @768Px, @1000Px)"

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

Giovanni_3478 Profilo | Senior Member

Ciao Lorenzo

Funziona!


Volendo forzare invece un valore esplicito in una colonna con l'attributo IDENTITY :
leggo dalla msdn

-- should return a warning.
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT products ON

Quando inserisco SET IDENTITY_INSERT products ON nella query di inserimento
mi restituisce un errore in sql express 2005:
"Il costrutto o l'istruzione SQL Dichiara cursore non è supportato."

Dipende dal fatto che uso sql Express 2005?

lbenaglia Profilo | Guru

>Volendo forzare invece un valore esplicito in una colonna con
>l'attributo IDENTITY :
>leggo dalla msdn
>
>-- should return a warning.
>INSERT INTO products (id, product) VALUES(3, 'garden shovel')
>GO
>-- SET IDENTITY_INSERT to ON.
>SET IDENTITY_INSERT products ON
>
>Quando inserisco SET IDENTITY_INSERT products ON nella query
>di inserimento
>mi restituisce un errore in sql express 2005:
>"Il costrutto o l'istruzione SQL Dichiara cursore non è supportato."
>
>Dipende dal fatto che uso sql Express 2005?

Ciao Giovanni,

non direi, l'errore che ricevi non riguarda il comando SET IDENTITY_INSERT.
Guarda il seguente esempio:

USE tempdb; CREATE TABLE dbo.products( id int NOT NULL IDENTITY PRIMARY KEY, product varchar(20) NOT NULL ); -- should return a warning. INSERT INTO dbo.products (id, product) VALUES(3, 'garden shovel'); /* Output: Server: Msg 544, Level 16, State 1, Line 1 Cannot insert explicit value for identity column in table 'products' when IDENTITY_INSERT is set to OFF. */ -- SET IDENTITY_INSERT to ON. SET IDENTITY_INSERT dbo.products ON; INSERT INTO dbo.products (id, product) VALUES(3, 'garden shovel'); /* Output: (1 row(s) affected) */ SELECT * FROM dbo.products; /* Output: id product ----------- -------------------- 3 garden shovel (1 row(s) affected) */ DROP TABLE dbo.products;

Ciao e Buon Natale

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

Giovanni_3478 Profilo | Senior Member

Intanto ti faccio gli auguri

...poi rispondo

Giovanni_3478 Profilo | Senior Member

Hai ragione avevo fatto io sicuramente qualche errore (anche se non l'ho ancora trovato)

la mia query è
InsertCommand="INSERT INTO background_image(nome_immagine, background_image, [768Px], [1000Px]) VALUES (@nome_immagine, @background_image, @768Px, @1000Px)"

Modificandola così
InsertCommand="SET IDENTITY_INSERT background_image ON;INSERT INTO background_image(id_immagine, nome_immagine, background_image, [768Px], [1000Px]) VALUES (@id_immagine, @nome_immagine, @background_image, @768Px, @1000Px)"

è possibile inserire un id a caso
"to fill a gap in the identity values caused by a DELETE statement"
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_set-set_7zas.asp).

In questo modo però l'id va sempre e comunque inserito:
invece io vorrei che non specificandolo facesse un autoincremento
e
specificandolo lo inserisse normalmente.

- Si può fare qualcosa direttamente da Sql
oppure devo inserire qualcosa nella aspx del tipo:
normalmente i'id viene inserito in automatico con l'autoincremento;
invece
cliccando su un linkbutton
viene cambiata la query
ed è possibile inserire l'id manualmente
??????

- in sqlExpress ci sono delle limitazioni di funzionalità per cui
alcune sintassi non vengono riconosciute?

- per ottenere il listato
del codice sql
come hai fatto?
Hai creato la tabella da codice senza editor visuale?

lbenaglia Profilo | Guru

>oppure devo inserire qualcosa nella aspx del tipo:
>normalmente i'id viene inserito in automatico con l'autoincremento;
>invece
>cliccando su un linkbutton
>viene cambiata la query
>ed è possibile inserire l'id manualmente
>??????
Sicuramente questa è la soluzione più corretta.
Puoi prevedere due procedure parametriche di inserimento, una che prevede l'ID oltre agli altri parametri e che nel suo corpo esegue una SET IDENTITY_INDSERT ON, INSERT, SET IDENTITY_INDSERT OFF e l'altra che si limita alla sola INSERT.

>- in sqlExpress ci sono delle limitazioni di funzionalità per
>cui
>alcune sintassi non vengono riconosciute?
No. Il T-SQL è implementato allo stesso modo in tutte le edizioni di SQL Server. C'è da dire che alcune funzionalità sono presenti solo in determinate edizioni di SQL Server (come il table partitioning, ecc) che trovi documentate nei Books Online.

>- per ottenere il listato
>del codice sql
>come hai fatto?
>Hai creato la tabella da codice senza editor visuale?
Si, ho scritto tutto a manina
Ad ogni modo da SQL Server Management Studio (anche Express) puoi generare il codice T-SQL di uno o più oggetti tramite il wizard "Generate SQL Script...".
Per quanto riguarda stored procedure, triggers, viste e funzioni puoi ottenere il codice T-SQL anche tramite la stored procedure di sistema sp_helptext.

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

Giovanni_3478 Profilo | Senior Member

Grazie mille per tutte le spiegazioni
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