Ottimizzare il DataReader: CommandBehavior

di Andrea Zani, in UserScript, ASP.NET, ADO.NET,

Utilizzando la classe DataReader possiamo specificare alcune opzioni aggiuntive al momento dell'accesso ai dati.
Vediamo innanzitutto il codice utilizzato per popolare un DataGrid da un database Access a cui accedere sfruttanod OleDb:

dim str_conn = "Provider=..."
dim datareader as OleDbDataReader
dim conn as new OleDbConnection(str_conn)
dim command as new OleDbCommand("select * from tabella", conn)

conn.Open()
datareader = command.ExecuteReader()
DataGrid1.DataSource = datareader
conn.Close()

ExecuteReader permette l'utilizzo di un parametro opzionale, chiamato CommandBehavior:

'chiude la connessione al database dopo la chiusura del datareader
CommandBehavior.CloseConnection

' prende solo il primo record dal database
CommandBehavior.SingleRow

' lettura sequenziale dei campi del record, comodo per dati di dimensioni importanti, ad esempio in formato binario
CommandBehavior.SequentialAccess

' esegue solo una query al database
CommandBehavior.SingleResult

' informazioni sulle primary key della tabella
CommandBehavior.KeyInfo

'informazioni sulla strutta della tabella
CommandBehavior.SchemaOnly

In questo breve spazio prenderemo solo in considerazione le prime due opzioni, che sono poi le più utili.
Se eseguiamo il codice qui sopra, otterremo come risultato l'intero contenuto della nostra tabella. Se specifichiamo l'opzione "SingleResult" per l'ExecuteReader, invece, otterremo solo il primo record della nostra tabella, proprio come se eseguissimo la query "select top 1 * from Tabella".

...
datareader=command.ExecuteReader(CommandBehavior.SingleResult)
...

Specificando l'opzione "CloseConnection", dopo il popolamento del datagrid, la connessione sarà chiusa immediatamente:

conn.Open()
datareader = command.ExecuteReader(CommandBehavior.CloseConnection)
DataGrid1.DataSource = datareader
' conn.Close() <- questa riga non è più necessaria.

Possiamo unire le due opzioni, per ottenere il primo record e la chiusura immediata della connessione per avere il massimo delle prestazioni:

datareader=command.ExecuteReader(CommandBehavior.SingleResult or CommandBehavior.CloseConnection)

Equivalente in C# a:

datareader=command.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);

L'utilizzo dell'opzione CloseConnection è molto utile anche nel passaggio di un DataReader tra più strati di un'applicazione. Possiamo creare una funzione in un classe separata che ci restituisce un datareader che chiuderà automaticamente la connessione alla fine delle nostre operazioni:

function GetData() as OleDbDataReader
  dim str_conn="Provider=..."
  dim datareader as OleDbDataReader
  dim conn as new OleDbConnection(str_conn)
  dim command as new OleDbCommand("select * from tabella",conn)

  conn.Open()
  datareader=command.ExecuteReader(CommandBehavior.CloseConnection)
  return datareader
end function

sub Page_Load()
  DataGrid1.DataSource=GetData()
  DataGrid1.DataBind()
end sub

In questo esempio, grazie all'utilizzo del CommandBehavior, ci assicuriamo che alla fine del popolamento del datagrid, la connessione verrà chiusa senza impegnare ulteriormente le risorse del server.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi