Impedire record doppi

giovedì 31 gennaio 2008 - 11.52

santa Profilo | Newbie

ciao
usa da poco sql 2005

per impedire di inserire un record doppio
prima di inserirlo
avevo pensato di controllare nel db se già esiste, in caso negativo lo inserisco in caso positivo avverto l'utente

volevo solo sapere se per caso sql 2005 lo fa già impostando qualcosa nella tabella

grazie mille
ilario


alx_81 Profilo | Guru

>ciao
Ciao!

>avevo pensato di controllare nel db se già esiste, in caso negativo
>lo inserisco in caso positivo avverto l'utente
>volevo solo sapere se per caso sql 2005 lo fa già impostando
>qualcosa nella tabella
Puoi definire un vincolo di univocità (UNIQUE), che ti sollevi un'eccezione in caso di duplicazione della chiave definita come univoca.
oppure puoi utilizzare la funzione EXISTS, magari in una stored procedure. Una cosa del tipo:
IF NOT EXISTS(SELECT * FROM Tuatabella WHERE condizionechiave) INSERT.... ELSE -- avverti l'utente (RAISERROR)

>grazie mille
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>volevo solo sapere se per caso sql 2005 lo fa già impostando
>qualcosa nella tabella

Ciao Ilario,

In aggiunta a quanto scritto da Alessandro, è una buona regola definire in ogni tabella un vincolo di chiave primaria (PRIMARY KEY Constraint), ovvero una colonna o un insieme di colonne che definiscano univocamente ogni riga della tabella.

Quindi, supponendo di avere la tabella Studenti dove ogni studente è identificato dal suo codice fiscale, per identificare in modo univoco uno studente (evitando di conseguenza studenti doppi) è sufficiente definire una PK sulla colonna CodiceFiscale.

Esempio:

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

>grazie mille
Prego.

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

santa Profilo | Newbie

grazie mille

ho utilizzato una chiave unique e poi gestisco l'eccezione


un ultimo consiglio per gestire al meglio l'eccezione , io faccio cosi ma non sono sicuro


try ....... ....... ....... cathc ex as sqlclient.sqlexception if ex.errorcode = -2146232060 ( è quello che mi è comparso facendo la prova) messagebox.show("esiste già ....... else messagebox.show ex.message........... end if ............. end try

il mio dubbio è che lo stesso numero di errore me lo fa se tento di eliminare un record collegato ad un'altra tabella

ciao
ilario

santa Profilo | Newbie

grazie anche a Lorenzo

<In aggiunta a quanto scritto da Alessandro, è una buona regola definire in ogni tabella un <vincolo di chiave primaria (PRIMARY KEY Constraint), ovvero una colonna o un insieme di <colonne che definiscano univocamente ogni riga della tabella.

l'ho inserita nella colonna id e poi ho fatto diverse relazioni con altre tabelle , ho provato ad aggiungere alla chiave primaria anche la colonna "codice" che mi interessa, ma mi dice di eliminare tutte le relazioni, ho preferito inserire un altra chiave sulla colonna codice che dover rifare tutte le relazioni

è proprio sbagliato?

ciao e grazie

ilario

lbenaglia Profilo | Guru

>ho utilizzato una chiave unique e poi gestisco l'eccezione
Cosa intendi con "chiave unique"? Un Constraint PRIMARY KEY, un Constraint UNIQUE o un Indice UNIQUE?

>if ex.errorcode = -2146232060 ( è quello che mi è comparso facendo
>la prova)

A questo punto recupera tutti gli errori contenuti nella collection Errors, ciclala per recuperare ogni oggetto di classe SqlError.
La proprietà Number ti fornirà il codice di errore nativo.
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlerror.aspx
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlerror_properties.aspx

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

lbenaglia Profilo | Guru

>l'ho inserita nella colonna id e poi ho fatto diverse relazioni
>con altre tabelle , ho provato ad aggiungere alla chiave primaria
>anche la colonna "codice" che mi interessa, ma mi dice di eliminare
>tutte le relazioni, ho preferito inserire un altra chiave sulla
>colonna codice che dover rifare tutte le relazioni
>
>è proprio sbagliato?
Se la dimensione della chiave naturale (il codice in questo caso) è eccessiva (ad esempio un char(1000)) oppure la PRIMARY KEY è composta da un numero elevato di colonne, è buona norma definire una chiave surrogata (il tuo ID) ed utilizzare questa come PRIMARY KEY per definire relazioni con le altra tabelle.

Dato che per definizione non è possibile definire due PRIMARY KEY, puoi tranquillamente definire un Constraint UNIQUE sulle altre colonne che richiedono un vincolo di univocità.

>ciao e grazie
Prego.

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

santa Profilo | Newbie

grazie mille per tutti i consiglio


utilizzo number che mi restituisce il codice dell'errore

grazie alla prossima

ilairo

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