Inserimento record con chiavi eliminate

venerdì 01 giugno 2012 - 11.18
Tag Elenco Tags  C#  |  .NET 3.0  |  .NET 3.5  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  SQL Server 2008 R2  |  SQL Server 2008

andrestu Profilo | Expert

problema:
ho un sito web dove gli utenti effettuano delle ricerche filtrate in base a diversi valori.
vorrei a questo punto memorizzare su database le ricerche effettuate dagli utenti con i relativi valori scelti.
vorrei però farlo in differita nel senso che memorizzo temporaneamente in un oggetto dedicato (in modo da non appesantire le operazioni su database) le ricerche fatte dagli utenti e ad ogni tot salvo il tutto sul db.
questi record che salvo nel db hanno dei campi che sono chiavi secondarie rispetto ad altre tabelle e qui nasce il problema:

cosa succede se cambio questi campi e ancora non salvato su db le ricerche?
può succedere che mi genera un errore di inserimento perchè le chiavi non esistono o non corrispondono.

vorrei a questo punto fare in modo che in caso di errore di questo tipo mi ignori l'inserimento, pensavo dunque di mettere all'interno di un try catch il blocco di codice che serve all'inserimento, volevo sapere se ci potrebbe essere un altra strada ad esempio pensavo ad una stored procedure che in caso di inserimento errato non mi generi l'errore, è possibile?

Andrea Restucci - Web Developer

alx_81 Profilo | Guru

ciao
>questi record che salvo nel db hanno dei campi che sono chiavi
>secondarie rispetto ad altre tabelle e qui nasce il problema:
cosa vuoi dire con chiavi secondarie?

>cosa succede se cambio questi campi e ancora non salvato su db le ricerche?
>può succedere che mi genera un errore di inserimento perchè le
>chiavi non esistono o non corrispondono.
errore di inserimento? Perchè la tabella delle ricerche ha delle FK?

>vorrei a questo punto fare in modo che in caso di errore di questo
>tipo mi ignori l'inserimento, pensavo dunque di mettere all'interno
>di un try catch il blocco di codice che serve all'inserimento,
>volevo sapere se ci potrebbe essere un altra strada ad esempio
>pensavo ad una stored procedure che in caso di inserimento errato
>non mi generi l'errore, è possibile?
prima vorrei capire cosa devi fare di preciso, perchè ancora non ti seguo bene
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

l'errore di cui parlo è il classico errore di riferimenti a chiavi non valide, ti faccio un esempio banale:

tabella ricerche
id (chiave primaria)
idCategoria (chiave secondaria - relazione con chiave primaria di tabella categoria )
altre colonne varie...

tabella categoria
id (chiave primaria)
altre colonne varie...

PS: questo è solo un esempio in realtà la struttra è molto più complessa

ora ammettiamo che inserisco un record nella tabella ricerche il cui valore della colonna "idCategoria" non è corretto, per esempio un numero id della tabella categoria che è stato eliminato, cosa succede?
ovviamente ottengo un errore.
Per non ottentere un errore dovrei fare prima un controllo sulla tabella categoria per verificare se l'id esiste e quindi evitare l'inserimento oppure inserire le istruzioni all'interno di un try catch.

Volevo sapere se esiste qualche istruzione sql che potrei inserire all'interno di una stored procedure (un istruzione tipo un try catch e non un controllo tramite select) in modo da evitare l'utilizzo del try cath...

sicuramente ti stai chiedendo comè possibile che possa inserire un valore di chiavi non esistente, il motivo è che lavoro con dati disconnessi quindi per come è strutturata l'applicazione può succedere.
Preciso che In questo caso è abbastanza irrilevante che il record venga o meno inserito, quindi il comportamento che voglio ottenere è:
se i dati del record che sto inserendo sono validi fai l'inserimento altrimenti no.
i dati di questa tabella sono ad uso reportistica sulle ricerche fatte dagli utenti quindi se viene ommesso qualche record non ha molta importanza




Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>l'errore di cui parlo è il classico errore di riferimenti a chiavi
>non valide, ti faccio un esempio banale:
>
>tabella ricerche
>id (chiave primaria)
>idCategoria (chiave secondaria - relazione con chiave primaria
>di tabella categoria )
>altre colonne varie...
>
>tabella categoria
>id (chiave primaria)
>altre colonne varie...
ah ok, una foreign key non avevo capito il termine chiave secondaria, scusami, visto che alcuni gestionali lo usano in maniera non corretta volevo verificare la cosa.

>ora ammettiamo che inserisco un record nella tabella ricerche
>il cui valore della colonna "idCategoria" non è corretto, per
>esempio un numero id della tabella categoria che è stato eliminato,
>cosa succede? ovviamente ottengo un errore.
eh sì, violazione di foreign key constraint

>Volevo sapere se esiste qualche istruzione sql che potrei inserire
>all'interno di una stored procedure (un istruzione tipo un try
>catch e non un controllo tramite select) in modo da evitare l'utilizzo
>del try cath...
direi che la miglior strada da seguire è quella di controllare prima con una EXISTS. Se il risultato della EXISTS ti torna false, allora non devi inserire e puoi tornare un output param da una stored procedure se proprio vuoi gestire l'errore.


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5