Le applicazioni spesso devono comunicare con un database, sia per leggerne i dati che per aggiornarli. Il Framework .NET fornisce Microsoft ActiveX Data Objects.NET (ADO.NET) è un modello, per l'accesso in lettura e scrittura ai database. Il modello di ADO.NET non è altro che il flusso strutturato attraverso vari componenti I dati memorizzati in un database vengono recuperati attraverso un oggetto chiamato provider di dati. Un'applicazione tipicamente accede ai dati tramite un DataSet o un DataReader. Un DataSet è una struttura dati che permette di memorizzare una serie di tabelle in modo da poter lavorare in maniera disconnessa. Un DataReader fornisce invece un accesso ai dati in modalità di sola lettura e forwardonly. D ATA P R O V I D E R Il provider di dati in ADO.NET è costituito da quattro oggetti seguenti: Oggetto Descrizione Connection Utilizzato per configurare un collegamento a una fonte di dati. Command Un comando non è altro che un'istruzione SQL utilizzata per effettuare operazioni sui dati DataReader DataAdapter fornisce un accesso ai dati in modalità di sola lettura e forward-only. E' un adattatore di dati che permette di trasferire i dati dal e verso database. D ATA S E T DataSet è una rappresentazione in memoria dei dati. Una volta caricati i dati tramite un Adapter, lavora in modalità disconnessa. Funziona come un database in memoria, e come un database ha tabelle, viste, primary key etc... La classe DataSet fa parte del namespace System.Data Oggetto Descrizione DataTableCollection Contiene tutte le tabelle del DataSet. DataRelationCollection Contiene i legami tra tabelle in un DataSet. ExtendedProperties Contiene informazioni aggiuntive. DataTable Contiene una tabella nel DataTableCollection di un DataSet. DataRelation Rappresenta una relazione nella DataRelationshipCollection del DataSet. DataRowCollection Contiene tutte le righe di un DataTable. DataView E' una vista personalizzata su un DataTable che può essere filtrato, ordinato etc... PrimaryKey Esso rappresenta la primary Key, ovvero la colonna che che identifica in modo univoco una riga in un DataTable. DataRow E' una riga nella DataTable. DataColumnCollection DataColumn Rappresenta tutte le colonne in un DataTable. Rappresenta una colonna di un DataTable. CONNECTION Il Framework .NET fornisce diverse classi per il collegamento a un database, in base al tipo di database a cui ci si collega. •SqlConnection: per le connessioni a Microsoft SQL Server. •OleDbConnection: per il collegamento a diversi database, come ad esempio Oracle o anche Access. Esempio 1: connessione a un database Imports System.Data Imports System.Data.SqlClient Module esempioSql Sub Main() Dim connection As SqlConnection = New SqlConnection() connection.ConnectionString = "Data Source=Nome_Server; Initial Catalog=Nome_DB;Integrated Security=True" connection.Open() Dim adp As SqlDataAdapter = New SqlDataAdapter ("select * from Orders", connection) Dim ds As DataSet = New DataSet() adp.Fill(ds) End Sub End Module In questo semplice esempio, ci siamo collegati ad un database tramite la ConnectionString ed abbiamo caricato i dati della tabella "Orders" in un DataTable. Esempio 2: Creazione datatable in memoria Imports System.Data Imports System.Data.SqlClient Module esempioSql Sub Main() Dim ds As DataSet = New DataSet() Dim books As DataTable = New DataTable("MyBooks") books.Columns.Add("id", Type.GetType("System.Int32")) books.Columns.Add("year", Type.GetType("System.Int32")) books.Columns.Add("title", Type.GetType("System.String")) books.Columns.Add("author", Type.GetType("System.String")) AddBook(1, 2016, "Titolo 1", "Autore 1") AddBook(2, 2016, "Titolo 2", "Autore 2") AddBook(3, 2016, "Titolo 3", "Autore 3") AddBook(4, 2016, "Titolo 4", "Autore 4") ds.Tables.Add(books) End Sub Private Sub AddBook(ByRef table As DataTable, ByRef id As Integer, ByRef year As Integer, ByRef title As String, ByRef author As String) Dim newrow As DataRow = table.NewRow() newrow("id") = id newrow("year") = year newrow("title") = title newrow("author") = author table.Rows.Add(newrow) End Sub End Module In questo esempio creiamo un DataTable contenente una tabella "books" ed inseriamo dentro tale tabella 4 record. Esempio 3: connessione con OleDB <%@ Import Namespace="System.Data.OleDb" %> <%@ Import Namespace="System.Data" %> <HTML> <script language="VB" runat="server"> Private Sub btnFiltra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim DS As DataSet Dim MyConnection As OleDbConnection Dim MyCommand As OleDbDataAdapter Dim SelectCommand As String = "select * from utenti where cognome = @cognome" MyConnection = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" & _ Server.MapPath("database/utenti.mdb")) MyCommand = New OleDbDataAdapter(SelectCommand, MyConnection) MyCommand.SelectCommand.Parameters.Add(New OleDbParameter("@cognome", 2)) MyCommand.SelectCommand.Parameters("@cognome").Value = tbFiltro.Text DS = New DataSet MyCommand.Fill(DS, "utenti") MyDataGrid.DataSource = DS.Tables("utenti").DefaultView MyDataGrid.DataBind() End Sub </script> <body> <form id="Form1" method="post" runat="server"> <asp:TextBox id="tbFiltro" runat="server">pippo</asp:TextBox> <asp:Button id="btnFiltra" runat="server" Text="Filtra Cognome" OnClick="btnFiltra_Click"></asp:Button> <BR><BR> <ASP:DataGrid id="MyDataGrid" runat="server"> </ASP:DataGrid></form> </body> </HTML> Esempio 4: Usare le transaction Private Sub UpdateWithTransactions() Dim conn As SqlConnection = New SqlConnection conn.ConnectionString = "server=NOMEDBSERVER;database=NOMEDB;uid=USERID;pwd=PASSWORD;" conn.Open() Dim trans As SqlTransaction trans = conn.BeginTransaction() Try Dim sql1 As String = "Insert INTO Tabella1 (campo) VALUES ('valore')" Dim sql2 As String = "Insert INTO Tabella2 (campo1,campo2) VALUES ('valore1','valore2')" Dim comm As SqlCommand = New SqlCommand comm.Connection = conn comm.Transaction = trans comm.CommandText = sql1 comm.ExecuteNonQuery() comm.CommandText = sql2 comm.ExecuteNonQuery() trans.Commit() Response.Write("Fine elaborazione") Catch ex As SqlException trans.Rollback() Response.Write(ex.ToString()) Finally conn.Close() End Try End Sub