Introduzione ad ADO.NET

3 pagine in totale: <<Indietro 1 2 [3]

Query transazionali

L'oggetto Command dispone di una proprietà Transaction che è necessario impostare per eseguire l'oggetto Command come transazione.

L'utilizzo di transazioni permette infatti di ritornare al valore iniziale di un dato, effettuando quindi il rollback , prima di eseguire il commit della transazione stessa, che ha invece l'effetto di confermare la modifica all'interno del database.

Nel frammento di codice riportato di seguito è mostrato come implementare questo oggetto:

cn.Open
' faccio partire la transazione
Dim objTransaction As OleDbTransaction = cn.BeginTransaction
Dim sql As String = "INSERT INTO tabella (...) VALUES (...)"
Dim cmd As New OleDbCommand(sql, cn, objTransaction)
Dim result As Integer = cmd.ExecuteNonQuery()

If result = 0 Then
  Response.Write("Update fallito!")
  objTransaction.Rollback()
Else
  Response.Write("Sono stati aggiornati " & result & " record(s)!")
  objTransaction.Commit()
End If

Il ruolo del DataAdapter

L'oggetto DataAdapter ha la funzione di mettere in comunicazione le nostre applicazioni con quella che possiamo definire la parte disconnessa di ADO.NET rappresentata dall'oggetto DataSet . Quindi, se si desidera memorizzare i risultati di una query, l'oggetto DataSet diventa il contenitore di questi risultati, dove l'oggetto DataAdapter , attraverso il metodo Fill, si occupa di popolare la collezione DataTable dell'oggetto DataSet con i risultati delle query:

OleDbDataAdapter.Fill(DataSet)

A sua volta, il DataAdapter si occupa anche di inviare gli aggiornamenti pendenti all'interno del DataSet al database per il successivo aggiornamento.

Da sottolineare che tutta la logica di aggiornamento è interamente controllata dal DataAdapter, che presenta quattro proprietà fondamentali per effettuare le seguenti operazioni:

  • SelectCommand : specifica la query di selezione;
  • UpdateCommand : specifica la query di agiornamento;
  • InsertCommand : contiene il comando per gli inserimenti;
  • DeleteCommand : contiene la query per la cancellazione dei record.

Nel frammento di codice riportato di seguito è mostrato come si crea un oggetto DataAdapter e come popolare un oggetto DataSet attraverso il metodo Fill:

Dim cn As New OleDbConnection(...)
Dim sql As String = "SELECT * FROM tabella"
Dim objDataAdapter As New OleDbDataAdapter(sql, cn)
Dim objDataSet As New DataSet()
objDataAdapter.Fill(objDataSet)

Il metodo Fill ha portato alla creazione implicita di una collezione di DataTable all'interno del DataSet. Il DataTable ha una struttura similare a quella estrapolata dalla query, mentre il suo nome identificativo, non avendolo dichiarato esplicitamente, sarà uguale a "Table". E' possibile, però, chiamare il DataTable, secondo le nostre esigenze.

Dim objDataAdapter As New OleDbDataAdapter(sql, cn)
objDataAdapter.TableMappings.Add("Table", "Orders")
Dim objDataSet As New DataSet()
objDataAdapter.Fill(objDataSet)

Come si è potuto dai frammenti di codice precedenti, non è stato mai chiamato il metodo di apertura della connessione, questo perché il metodo Fill apre la connessione, invia la query, recupera i risultati e chiude la connessione appena aperta. Di seguito verranno elencati i metodi di un oggetto DataAdapter, compresi quelli che sono stati già trattati come il metodo Fill e il metodo Update:

  • Fill : esegue la query e memorizza i risultati in un oggetto DataTable;
  • FillSchema : recupera le informazioni sullo schema della tabella restituita dalla query;
  • GetFillParameters : restituisce un array contenente i parametri di SelectCommand;
  • Update : invia al database le modifiche pendenti nell'oggetto DataSet.

Anche se utili, queste funzionalità di sincronizzazione vanno evitate nell'ambito di un'applicazione web classica, poiché l'uso delle query (inline o meglio ancora con stored procedure) consente di avere un'applicazione più performante e soprattutto ha più senso in un ambiente disconnesso come il web, al contrario di un'applicazione Windows Forms (che usa le stesse classi di base) che potrebbe invece trarre giovamento da questo approccio.

Il contenitore per eccellenza: il DataSet

L'oggetto DataSet lo si può considerare come un contenitore di n oggetti DataTable, dove noi andremo a riportare i risultati di una query utilizzando l'oggetto DataAdapter.

A differenza dell'oggetto DataReader, il DataSet consente di esaminare il contenuto di qualsiasi riga, passando da una riga di risultati precedente o successiva in qualsiasi momento.

Inoltre consente di memorizzare nella cache le modifiche apportate ad un record ed inviarle al database in qualsiasi momento lo vogliamo utilizzando sempre l'oggetto DataAdapter.

All'interno del DataSet è anche possibile effettuare degli ordinamenti, delle ricerche e applicare filtri, determinare che tipo di operazione è stata effettuata (un inserimento, una modifica e cosi via), ma soprattutto confrontare i valori originali con quelli correnti, per ciascun record.

Il DataSet è composto da una struttura gerarchica formata da oggetti DataTable (le tabelle) e DataRelation (le releazioni). A sua volta, un oggetto DataTable contiene oggetti DataRow (le righe), DataColumn (le colonne) e Costraint (i vincoli).

Come è stato già spiegato in precedenza, i risultati di una query vengono memorizzati all'interno dell'oggetto DataTable che dispone di una proprietà Columns , che a sua volta restituisce un insieme di oggetti DataColumn , dove ciascuno di essi corrisponde a una colonna nei risultati della query.

Lo stesso identico discorso può essere fatto per le colonne, sfruttando la proprietà Rows , che restituisce un oggetto DataRowCollection che a sua volta contiene un insieme di oggetti DataRow .

Nel frammento di codice riportato di seguito è mostrato come una volta impostato il DataRow su una riga, l'accesso ai valori di una particolare colonna risulti essere estremamente semplice. Da notare che è possibile fornire sia il nome della colonna, che un valore intero che rappresenta la posizione della colonna:

Dim cn As New OleDbConnection(...)
Dim sql As String = "SELECT * FROM tabella"
Dim objDataAdapter As New OleDbDataAdapter(sql, cn)
Dim objDataSet As New DataSet()
objDataAdapter.Fill(objDataSet)

Dim objTable As DataTable = objDataSet.Tables(0)
Dim objRow As DataRow = objTable.Rows(1)

Response.Write("Campo1: " & objRow("NomeCampo"))
Response.Write("Campo2: " & objRow("NomeCampo"))

Conclusioni

Gli oggetti ADO.NET sono stati pensati per ridurre al minimo l'impatto delle query sul database, ma soprattutto per diminuire il più possibile la durata della connessione alla sorgente dati.

Molti si chiederanno quando è meglio utilizzare un DataReader e quando un DataSet. Una risposta secca e precisa probabilmente non esiste, la scelta può dipendere dal tipo di applicazione che si sta sviluppando, dalla conoscenza che abbiamo degli oggetti DataReader e DataSet e da tanti altri fattori, ma in linea di massima, quando c'è da leggere semplicemente dei dati, che non devono essere manipolati o tenuti in cache, il DataReader è da preferire in quanto, sotto la coperta, il DataAdapter utilizza proprio quest'ultimo per popolare il DataSet.

Sarebbe opportuno, dove possibile, utilizzare sempre l'oggetto DataReader per spostare la scelta sull'oggetto DataSet in situazioni di questo tipo:

  • quando risulta necessario memorizzare i dati per elaborarli, modificarli e poi ripassarli al client;
  • quando risulta necessario aggiornare i dati utilizzando i metodi del DataSet e DataAdapter piuttosto che utilizzare singoli statement SQL;
  • quando bisogna effettuare il binding dei dati legando gli stessi a più controlli;
  • quando risulta necessario avanzare o tornare indietro all'interno del resultset, cosa questa impossibile con l'oggetto DataReader.

Approfondimenti

3 pagine in totale: <<Indietro 1 2 [3]

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC