23

Aug

MCTS 70-516: Accesso ai dati tramite .NET 4! Parte 4

Ciao a tutti,

 

dopo qualche giorno di vacanza si riparte subito con lo studio per la certificazione! Oggi vedremo come inviare comandi SQL al nostro data store. 

 

L’oggetto DbCommand

Questo oggetto viene utilizzato per inviare comandi SQL al nostro data store. Per funzionare è richiesta una connessione valida aperta. Ci sono vari modi per utilizzare questo oggetto, ma il migliore è quelli di utilizzare il metodo CreateCommand sull’oggetto in modo che DbConnection crea in maniera automatica il provider appropriato! Vediamo un esempio per capire meglio:

var nw = ConfigurationManager.ConnectionStrings["nw"];
var connection = new SqlConnection(nw.ConnectionString);
var cmd = connection.CreateCommand();

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "CustOrderHist";
//Non dimentichiamoci di chiudere la connessione!

Questo codice crea un oggetto DbConnection che è un’istanza di SqlConnection. L’ oggetto DbConnection viene quindi utilizzato per creare un oggetto SqlCommand, che viene assegnato a cmd. L'oggetto DbConnection deve essere aperto prima di ogni comando. Se esegue una stored procedure, la proprietà CommandText deve contenere il nome della stored procedure e il CommandType deve essere valorizzato come StoredProcedure.

 

L’oggetto DbParameter

Di solito le stored procedure richiedono dei parametri che devono essere passati per eseguire correttamente la query! Per fare ciò si utilizza l’oggetto DbParameter:

DbParameter parm = cmd.CreateParameter();
parm.ParameterName = "@Id";
parm.Value = "ANATR";
cmd.Parameters.Add(parm);

A questo punto siamo pronti per inviare la query. Si usa il metodo ExecuteNonQuery quando non ci aspettiamo un valore di ritorno dalla query, quindi per gli insert, update e delete. Questo metodo ritorna un intero che rappresenta il numero di righe coinvolte durante l’esecuzione della query. Se invece vogliamo inviare una query di tipo Select allora abbiamo bisogno del metodo ExecuteReader. Questo metodo ritorna una istanza dell’oggetto DbDataReader che ci serve per poter elaborare la risposta della nostra query. Questo contiene un metodo chiamato Read che serve per recuperare i dati nel suo buffer. Vediamo un esempio:

var nw = ConfigurationManager.ConnectionStrings["nw"];
var connection = new SqlConnection();
connection.ConnectionString = nw.ConnectionString;
var cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ProductID, ProductName FROM Products";
connection.Open();
var rdr = cmd.ExecuteReader();
var products = new DataTable();
products.Load(rdr, LoadOption.Upsert);
connection.Close();

L’ultimo oggetto che andremo ad analizzare in questa lezione è DbDataAdapter. Viene usato per riceve e modificare i valori tra un data table ed un data store. La proprietà SelectedCommand è il comando sql che viene usato da questo oggetto quando deve prelevare dei dati. Analogamente  ci sono le proprietà InsertCommand, UpdateCommand e DeleteCommand. Quando DbDataAdapter è usato per leggere o modificare dati, lui esamina in automatico lo stato della connessione: Se è aperta, utilizza la connessione e la lascia aperta, nel caso fosse chiusa, apre la connessione, esegue i comandi e poi la chiude.

 

Un metodo molto importante di questo oggetto è il metodo Fill.Questo serve per trasferire i dati dal datastore ad un oggetto DataTable. Questo oggetto ha numerosi overload. Vediamo come utilizzarlo:

var nw = ConfigurationManager.ConnectionStrings["nw"];
var connection = new SqlConnection();
connection.ConnectionString = nw.ConnectionString;
var cmd = (SqlCommand)connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers";
var da = new SqlDataAdapter(cmd);
var nwSet = new DataSet("nw");
da.Fill(nwSet, "Customers");
MessageBox.Show("DataSet Filled");

Tramite il metodo Update  esposto sempre dall’oggetto DbDataAdapter possiamo, una volta effettuata una modifica ai dati, persistere i cambiamenti nel data store. Ecco un esempio:

var nw = ConfigurationManager.ConnectionStrings["nw"];
var connection = new SqlConnection();
connection.ConnectionString = nw.ConnectionString;
var cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM Customers";
var da = new SqlDataAdapter(cmd);
var nwSet = new DataSet("nw");
var bldr = new SqlCommandBuilder(da);
da.Fill(nwSet, "Customers");

//Modify existing row
var customersTable = nwSet.Tables["Customers"];
var updRow = customersTable.Select("CustomerID='WOLZA'")[0];
updRow["CompanyName"] = "New Wolza Company";

//Add new row
customersTable.Rows.Add(
"AAAAA", "Five A Company");

//Delete a row, note that you cannot delete a customer who has orders
var delRow = customersTable.Select("CustomerID='PARIS'")[0];
delRow.Delete();


//send changes to database
da.Update(nwSet, "Customers");
dataGridView2.DataSource = nwSet;
dataGridView2.DataMember = "Customers";
MessageBox.Show("Update Complete");

Ora sappiamo integrare appieno la nostra applicazione con un data store! Abbiamo visto come leggere, modificare, inserire e cancellare i record. A questo punto siamo pronti per abbandonare le classi connesse di Ado.Net e passare a Language Integrated Query (LINQ)!

 

Buona giornata e alla prossima!

Carmine Punella

by Carmine Punella on 8/23/2011
Post archive