Query in Transazione

di il
7 risposte

Query in Transazione

Sto sviluppando per diletto un'applicazione in C# che si connette ad un db access che però è su un'altra macchina a cui
mi connetto tramite VPN. Per ora la connessione funzika.

Voglio sviluppare le query INSERT e UPDATE, quando sono da sole ma anche quando sono una dopo l'altra, in Transazione.
Sto utilizzando un esempio trovato qui:"carlovecchio.altervista.org/c----lavorare-con-i-database-access-accdb.html"

Volevo farmi dire da voi .... se ho capito la logica della transazione:

 string q = "Insert into Ricetta (NomeRicetta, Descrizione, CodiceProdottoFinito, UdmFinito, CostoUnitario) values ('" + TBName.Text.Replace("'", "''") + "', '" + TBDescrizione.Text.Replace("'", "''") + "', '" + TBCodice.Text.Replace("'", "''") + "', '" + CBUM.Text.Replace("'", "''") + "', '" + TBCosto.Text.Replace("'", "''") + "')";
                Database.TransazioneBegin();
                try
                {
                    int r = d.EseguiQueryNonSelect(q);
                    Database.TransazioneCommit();
                    if (r > 0)
                    {
                        MessageBox.Show("Nuova ricetta aggiunta correttamente.", "Aggiungi Ricetta", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Popola();
                        TBName.Text = "";
                        TBDescrizione.Text = "";
                        TBCosto.Text = "";
                        TBCodice.Text = "";
                        CBUM.SelectedIndex = -1;
                        CBUM.Text = "";
                        CBElenco.SelectedIndex = -1;
                        CBElenco.Text = "";
                    }
                }
                catch (Exception ex)
                {
                    try
                    {
                        Database.TransazioneRollback();
                    }
                    catch (Exception exR)
                    {
                        MessageBox.Show(exR.Message);
                    }
                }      
Non ho ben capito qual è la sequenza di operazioni eseguite se la querynonselect dovesse andare storta. Quando viene eseguita la rollback? Ho capito bene che la rollback ripristina lo stato del database all'istantanea fatta prima del transazionebegin?

Grazie

7 Risposte

  • Re: Query in Transazione

    zoro82 ha scritto:


    ...Ho capito bene che la rollback ripristina lo stato del database all'istantanea fatta prima del transazionebegin?...
    Si ma non solo. Ti evita anche letture sporche dei dati e tante altre cose spiacevoli che potrebbero capitare in caso di accesso multiutenza.

    Ci sono delle imprecisioni nel codice, non solo a livello di nome del metodo. Guarda la guida ufficiale per vedere come impostare correttamente il codice.

    E usa i parametri per inserire i valori, non concatenare le TextBox.Value.
  • Re: Query in Transazione

    Grazie della risposta.
    Di che imprecisioni parli?
    Cosa intendi quando parli di imprecisioni in nome del metodo?

    Si la concatenazione posso sostituirla con i parametri, ma non lo vedo un grosso problema.
  • Re: Query in Transazione

    zoro82 ha scritto:


    Di che imprecisioni parli?
    Cosa intendi quando parli di imprecisioni in nome del metodo?
    L'oggetto OleDbTransaction lo ottieni dalla OleDbConnection e lo assegni all'OleDbCommand. Se leggi la guida, i passaggi son molto chiari.
    I metodi sono Begin, Commit e RollBack, non [Database.TransazioneCommit();] ma non so come tu abbia impostato il resto del codice...

    zoro82 ha scritto:


    Si la concatenazione posso sostituirla con i parametri, ma non lo vedo un grosso problema.
    Scelta tua. Ovvio che se usi solo tu l'applicativo che stai sviluppando non hai problemi di Sql Injection. Ma almeno ti eviteresti quel Replace che (questione di gusti) non mi piace, e in più avresti già un pre-controllo sui dati inseriti.
  • Re: Query in Transazione

    Sgrubak ha scritto:


    zoro82 ha scritto:


    Di che imprecisioni parli?
    Cosa intendi quando parli di imprecisioni in nome del metodo?
    L'oggetto OleDbTransaction lo ottieni dalla OleDbConnection e lo assegni all'OleDbCommand. Se leggi la guida, i passaggi son molto chiari.
    I metodi sono Begin, Commit e RollBack, non [Database.TransazioneCommit();] ma non so come tu abbia impostato il resto del codice...

    zoro82 ha scritto:


    Si la concatenazione posso sostituirla con i parametri, ma non lo vedo un grosso problema.
    Scelta tua. Ovvio che se usi solo tu l'applicativo che stai sviluppando non hai problemi di Sql Injection. Ma almeno ti eviteresti quel Replace che (questione di gusti) non mi piace, e in più avresti già un pre-controllo sui dati inseriti.
    Si, grazie quella replace non piace nemmeno a me. Seguirò il tuo consiglio. Soprattutto se protegge contro tutte le iniezioni.

    Più che altro adesso sto guardando la guida....della commit. Io vorrei bloccare il db in accesso esclusivo quando faccio l'operazione degli ordini. La ReadCommitted fa al caso mio?

    Grazie
  • Re: Query in Transazione

    zoro82 ha scritto:


    ...Più che altro adesso sto guardando la guida....della commit. Io vorrei bloccare il db in accesso esclusivo quando faccio l'operazione degli ordini. La ReadCommitted fa al caso mio?...
    ReadCommitted è uno dei valori dell'enumerazione IsolationLevel. Più che con il Commit, ha attinenza con uno degli overload del metodo Begin.

    Conta che, citando la guida:
    Il livello di isolamento di una transazione viene determinato al momento della creazione della transazione. Per impostazione predefinita, l' System.Transactions infrastruttura crea Serializable le transazioni.
    Se non ne hai una esigenza specifica, non abbasserei il livello di isolamento portandolo a ReadCommitted.
  • Re: Query in Transazione

    Sgrubak ha scritto:


    zoro82 ha scritto:


    ...Più che altro adesso sto guardando la guida....della commit. Io vorrei bloccare il db in accesso esclusivo quando faccio l'operazione degli ordini. La ReadCommitted fa al caso mio?...
    ReadCommitted è uno dei valori dell'enumerazione IsolationLevel. Più che con il Commit, ha attinenza con uno degli overload del metodo Begin.

    Conta che, citando la guida:
    Il livello di isolamento di una transazione viene determinato al momento della creazione della transazione. Per impostazione predefinita, l' System.Transactions infrastruttura crea Serializable le transazioni.
    Se non ne hai una esigenza specifica, non abbasserei il livello di isolamento portandolo a ReadCommitted.
    Ok, dovrebbe andar bene per me: Durante la transazione è possibile leggere ma non modificare i dati volatili e non è possibile aggiungere nuovi dati.

    Più che altro non ho capito bene come funziona....ho fatto la seguente prova in debug:
    faccio la transazione begin, metto un breakpoint sulla query e mi fermo, rendo non raggiungibile il database, vado avanti col debug ma non mi cattura l'eccezione e quindi non mi fa la rollback
  • Re: Query in Transazione

    Forse è il caso che posti il codice e segnali su quale riga ti fermi per rendere inaccessibile il DB, spieghi come fai a renderlo inaccessibile e segnali anche su quale riga ti aspetti l'eccezione...
Devi accedere o registrarti per scrivere nel forum
7 risposte