Angella Andrea - Italian Blog

Infinita passione per lo sviluppo software !
posts - 133, comments - 216, trackbacks - 9

My Links

News

MIT OpenCourseWare: I'm invested Wikipedia Affiliate Button


Sto leggendo:

Archives

Post Categories

Siti web realizzati

Siti web tecnici

[70-526] - ADO.NET in modalità connessa e Transazioni

Area di riferimento

- Integrating Data in a Windows Forms Application
    - Manage connections and transactions
        - Perform transactions by using the Transaction object
    - Create, add, delete, and edit data in a connected environment


Eseguire comandi in un contesto transazionale

La classe SqlCommand permette la creazione di un comando (in sostanza una query SQL). La collection Parameters permette di aggiungere parametri (istanze di SqlParameter) nel caso in cui si utilizzino query parametriche ed è bene farlo per evitare attacchi di tipo SQL Injection. Il metodo ExecuteNonQuery esegue query che non richiedono l'analisi di un risultato, nell'esempio comandi di inserimento.
Per eseguire dei comandi in un contesto transazionale è necessario costruire un oggetto Transaction utilizzando il metodo BeginTransaction della classe Connection specificando eventualmente un parametro per definire il comportamento di blocco della connessione. Inoltre per ogni comando è necessario impostare la proprietà Transaction all'oggetto appena creato (o passarlo direttamente nel costruttore di Command).

Di seguito mostro un esempio di esecuzione di due comandi per inserire studenti. Questi due comandi saranno eseguiti all'interno di un unico contesto transazionale:

// Dati che voglio inserire nella tabella Studente
string nome1 = "Andrea";
string cognome1 = "Angella";
string nome2 = "Laura";
string cognome2 = "Angella";

SqlConnection conn = null;
SqlTransaction transaction = null;

try
{
   // Costruisco e apro la connessione
    conn = new SqlConnection(connectionString);
    conn.Open();

    // Costruisco un oggetto Transaction
    transaction = conn.BeginTransaction(IsolationLevel.Unspecified);

    // Costruisco due oggetti command utilizzando i parametri
    SqlCommand command1;
    command1 = new SqlCommand("insert into Studente(Nome, Cognome) values (@Nome, @Cognome)",
                              conn, transaction);
    command1.Parameters.Add(new SqlParameter("@Nome", nome1));
    command1.Parameters.Add(new SqlParameter("@Cognome", cognome1));

    SqlCommand command2;
    command2 = new SqlCommand("insert into Studente(Nome, Cognome) values (@Nome, @Cognome)",
                              conn, transaction);
    command2.Parameters.Add(new SqlParameter("@Nome", nome2));
    command2.Parameters.Add(new SqlParameter("@Cognome", cognome2));

    // Eseguo i comandi in uno stesso contesto transazionale
    command1.ExecuteNonQuery();
    command2.ExecuteNonQuery();

    // Eseguo il commit della transazione
   transaction.Commit();
}
catch(Exception ex)
{
    // Se si è verificato un errore faccio Rollback della transazione
    if (transaction != null)
    {
        transaction.Rollback();

        MessageBox.Show("Si è verificato un errore:\n" + ex.Message);
    }
}
finally
{
    if (conn != null)
    {
        conn.Close();
    }
}


I possibili valori della enumerazione IsolationLevel sono:

  • Chaos: le modifiche in sospeso della transazione di livello più alto non possono essere sovrascritte
  • ReadCommitted: i blocchi condivisi sono mantenuti mentre i dati vengono letti, ma i dati possono essere modificati prima della fine della transazione
  • ReadUncommitted: non viene generato alcun vlocco condiviso e non viene generato alcun blocco esclusivo
  • RepeatableRead: sono imposti blocchi esclusivi su tutti i dati utilizzati nella query
  • Serializable: un blocco di intervallo viene imposto sul DataSet
  • Unspecified: un livello di isolamento esistente non può essere determinato

Lettura dei dati da una tabella

Utilizzare un DataReader per scorrere fra i risultati di una query è un'operazione molto semplice.
Di seguito riporto il codice per leggere tutti gli studenti presenti nella tabella Studente e inserire il loro nome e cognome all'interno di una listBox:

SqlConnection conn = new SqlConnection(connectionString);                     
conn.Open();
SqlCommand command = new SqlCommand("select * from Studente", conn);

SqlDataReader reader = command.ExecuteReader();

listBox1.Items.Clear();
while (reader.Read())
{
    listBox1.Items.Add(reader["Nome"] + ", " + reader["Cognome"]);
}

conn.Close();

Print | posted on mercoledì 12 marzo 2008 01:19 | Filed Under [ Exam 70-526 Windows-Based Client Development ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET