33 messaggi dal 29 settembre 2010
Ciao,
ho un DetailsView connesso con un access tramite un accessdatasource.
Ora prima di inserire un nuovo valore con insert integrato nel DetailsView voglio controllare che il valore non sia già presente in database.
Devo per forza farlo tramite un event handler di tipo iteminserting in cui faccio una select e controllo se il valore è già presente? (settando poi la proprietà Cancel del DetailsViewInsertEventArgs a true)
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

Renga_it ha scritto:

Devo per forza farlo tramite un event handler di tipo iteminserting in cui faccio una select e controllo se il valore è già presente?

Quello è un modo, ma puoi anche ragionare in maniera 'ottimistica', ovvero lasciare che la INSERT venga eseguita e poi gestire l'eventuale eccezione seguente.

A tal proposito, gestisci l'evento OnInserted e controlla se il comando ha generato un'eccezione. Esempio:
public void onInserted(object sender, SqlDataSourceStatusEventArgs e)
{
    // Se l'eccezione non è null, significa che la INSERT ha generato un errore
    if (e.Exception != null)
    {
        //Mostro l'errore all'utente
        messaggio.Text = e.Exception.Message;
        //Segnalo di aver gestito l'eccezione. Così facendo la pagina non andrà in errore.
        e.ExceptionHandled = true;
    }
}

L'unico requisito, affinché si verifichi l'eccezione, è che devi avere un indice col vincolo UNIQUE sulla colonna che non ammette valori duplicati.

Ancora una considerazione: così facendo riuscirai a catturare non solo le violazioni del vincolo UNIQUE ma anche gli altri eventuali problemi che possono verificarsi quando si scrive nel database.

La proprietà e.Exception è di tipo Exception ma puoi castarla su SqlException o su OleDbException (a seconda del provider che stai utilizzando) così da poter recuperare informazioni aggiuntive sulla natura dell'errore. Ad esempio, potresti sfruttare il codice numerico dell'errore in un'istruzione switch per mostrare all'utente dei messaggi personalizzati.

ciao
Modificato da BrightSoul il 15 aprile 2012 13.34 -

Enjoy learning and just keep making
33 messaggi dal 29 settembre 2010
Ciao,
grazie per il consiglio ma non so se sia applicabile.
In pratica la tabella che vado a popolare è una tabella che registra l'entrata e l'uscita delle persone attraverso un id persona.
Io voglio che il sistemi blocchi un inserimento con un id nel caso in cui sia presente un record con lo stesso id e la data/ora uscita non ancora compilata (in pratica se la persona è ancora dentro la struttura). Quindi il controllo è anche sull'orario.
Al momento ho dovuto fare una select count nell'event handler item inserting e annullare l'operazione di inserimento nel caso sia già presente un record con lo stesso id e l'orario di uscita non compilato
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

Renga_it ha scritto:

Quindi il controllo è anche sull'orario.

Ok, allora potresti provare a creare un indice che coinvolga entrambe le colonne: l'id dell'utente e la data di uscita.

In questo modo, non ti sarà possibile inserire nuovamente il record di entrata perché in tabella è già presente quel record che porta l'id della persona e il valore null a significare "data di uscita non compilata".

ciao

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.