ACCESSO AI DATI Maurizio Fermeglia [email protected] Breve storia dell’Accesso ai Dati VB Objects – API proprietarie Data Access Objects (DAO/Jet) Open Database Connectivity (ODBC) OLE for Databases (OLE/DB) ActiveX Data Objects (ADO) .NET ADO.NET 21 December, 2015 - slide 2 Il concetto di Accesso ai dati Data Providers Project Data Consumers Mail File System Excel Tools & Languages Notes IMS SQL Svr Oracle Sybase 21 December, 2015 - slide 3 Acesso ai dati con ODBC Data Providers Data Consumers Project Mail File System Excel Notes Tools & Languages ODBC DAO RDO IMS SQL Svr Oracle Sybase 21 December, 2015 - slide 4 Accesso ai Dati con OLE DB Data Providers OLE DB Project Data Consumers OLE DB Mail OLE DB File Tools Languages OLE DB Excel OLE DB Notes OLE DB IMS OLE DB SQL Svr OLE DB Oracle OLE DB Sybase DAO OLE ADO DB System 21 December, 2015 - slide 5 Lo scenario …. Applicatione DAO ODBCDirect ADO ADO .NET RDO JET mdb ISAM ODBC Mgr ODBC Drv OLEdb-ODBC SQL OLEDB Altri… 21 December, 2015 - slide 6 Access: Accesso a dati via ODBC Microsoft Access DAO 3.5 Jet Database Engine ODBCDirect RDO 2.0 ODBC Driver Manager .MDB Database ISAM Files SQL Server ODBC Driver Other ODBC Driver SQL Server Data Source Other Relational Data Source 21 December, 2015 - slide 7 La situazione ODBC da un client VB-VC VBSQL ODBC API DAO/JET DAO/ODBCDirect RDO 2.0 SQLDMO Oppure: ADO ADO .Net App VBSQL DAO RDO Jet ODBC ADO SQLDMO data OLEdb 21 December, 2015 - slide 8 VBSQL Microsoft SQL Server via DB-Library interfaccia alle API del server una delle prime soluzioni per il client/server da applicazioni VB specifica per SQL-Server veloce e lightweight senza interfaccia ad oggetti problemi di conversione da 16 bit (VBX) a 32 bit (OCX) 21 December, 2015 - slide 9 ODBC API qualsiasi fonte ODBC interfaccia a ODBC Driver Manager difficile da utilizzare, proponibile in un numero molto ridotto di casi specifici sconsigliabile per l’accesso a ISAM richiede l’inclusione delle dichiarazioni delle funzioni molto codice da implementare nell’applicazione cliente 21 December, 2015 - slide 10 DAO/JET database nativi, ISAM particolari, qualsiasi fonte ODBC paradigma ad oggetti per utilizzare il Jet Engine sui database nativi consente: DDL (TableDefs, QueryDefs, Relations) DML (Recordsets) sicurezza (Users, Groups) replica (metodi e proprietà) usato da Access per i propri documenti e oggetti limiti: stored procedure, eventi, cursori server-side 21 December, 2015 - slide 11 DAO: Jet Workspace Object Model 21 December, 2015 - slide 12 DAO/ODBCDirect qualsiasi fonte ODBC salta il Jet Engine nelle connessioni a ODBC richiede RDO non possiede eventi problemi di distribuzione (licenze) consente solo operazioni di DML nato e consigliato per accesso ai dati da Office 21 December, 2015 - slide 13 ODBCDirect Consente a DAO di accedere a fonti ODBC tramite RDO invece che tramite Jet Per usare ODBCDirect, creare un Workspace di tipo ODBCDirect Set ws = DBEngine.CreateWorkspace(…, dbUseODBC) DBEngine.DefaultType = dbUseODBC Data1.DefaultType = dbUseODBC Porting “rapido” delle applicazioni DAO a ODBCDirect meno overhead in risorse e in prestazioni entro certi limiti, si può fare a meno del Jet le funzionalità DAO ISAM-oriented non sono supportate E’ l’unica interfaccia di automazione inclusa in Office che consenta di accedere a fonti dati ODBC senza passare per Jet Office non contiene la licenza d’uso e di ridistribuzione di RDO 21 December, 2015 - slide 14 DAO: ODBCDirect Workspace OM 21 December, 2015 - slide 15 RDO qualsiasi fonte ODBC paradigma ad oggetti efficiente per usare fonti ODBC non supporta interfacce a tabelle o DDL scongliato con ISAM efficiente, rapido e lightweight verso database relazionali asincrono e event-driven 21 December, 2015 - slide 16 SQLDMO paradigma ad oggetti su Microsoft SQL Server una soluzione specifica per il client/server via Automation con SQL-Server veloce e lightweight 21 December, 2015 - slide 17 ADO qualsiasi fonte ODBC e tutte quelle disponibili via OLE DB supporto solo a 32 bit Incluso in MDAC X.Y Si tratta di uno strato SW sopra ad OLEdb 21 December, 2015 - slide 18 ADO: Oltre i database, tutti i tipi di dati Database aziendali File system Elaborazioni di dati ISAM Strutture dati personali Fogli elettronici Pianificazione di progetti E-mail Directory services... Presentati sotto forme diverse: Suoni Grafici Video Immagini Stream continui Dati relazionali 21 December, 2015 - slide 19 Il modello di ADO Un set semplificato, non gerarchico Elevate prestazioni, facilità d’uso Si presenta come un OLE DB Consumer Accessibile da C++, Visual Basic®, Java™, VBScript, VBA, JavaScript, C# Da C++ si può ottenere sia oggetti ADO che OLE DB, o entrambi Connection Command Parameters Recordset Fields Errors 21 December, 2015 - slide 22 Usare ADO con VBScript Predisporre il form <hmtl> tags e oggetti intrinseci </hmtl> Ottenere un recordset <object id=rs classid=”……………."></object> <script language="VBScript"> Provider, DataSource rs.open ………. Visualizzare i dati HTMLObject.Text = rs.Fields(……”).Value Navigare tra i dati rs.MoveNext, rs.MovePrevious 21 December, 2015 - slide 23 ADO e INTERNET 21 December, 2015 - slide 24 ODBC e OLE DB ODBC senza OLE DB App ODBC con OLE DB App App App ODBC API OLE DB Driver manager OLEdb ODBC ODBC ODBC ODBC ODBC driver driver driver driver driver Nessuno strato ulteriore su ODBC 21 December, 2015 - slide 25 ACCESSO AI DATI CON ADO .NET Maurizio Fermeglia [email protected] Perchè ADO.NET è migliore? E’ disconnesso da progetto Relazionale di natura Integrato con XML Il Framework Supporta lo schema reale del Database ADO.NET Connected Access Data Reader ADO.NET Disconnected Access Data Set Data Adapater 21 December, 2015 - slide 27 ADO.NET e .NET Framework Microsoft .NET Framework Web Services User Interface Data and XML ADO.NET XML ... ... Base Classes Common Language Runtime 21 December, 2015 - slide 28 ADO.NET Overview cos’è ADO.NET? ADO .NET è una collezione di classi, interfaccie, strutture e tipi che gestiscono l’accesso ai dati da fonti relazionali all’interno del .NET Framework Queste collezioni sono organizzate in namespaces: System.Data, System.Data.OleDb, System.Data.SqlClient, etc. ADO .NET è un evoluzione di ADO. Non condivide lo stesso modello ad oggetti, ma condivide molti dei paradigmi e delle funzionalità! 21 December, 2015 - slide 29 ADO.NET Overview Managed Providers Fonde ADO ed OLEDB in un unico strato Ciascun provider contiene un set di classi che implementano interfacce comuni I ‘managed provider’ implementati: ADO Managed Provider: fornisce l’accesso a fonti dati OLE DB SQL Server Managed Provider: fornisce accesso ottimale quando si utilizzi MS SQL Server Exchange Managed Provider: estrae e modifica dati da Microsoft Exchange 21 December, 2015 - slide 30 ADO.NET Overview Managed Providers Applicazione ADO.NET Managed Provider OLE DB Provider SQL Server Database SQL Managed Provider Database ADO Managed Provider 21 December, 2015 - slide 31 ADO vs. ADO.NET ADO Progettato per accessi connessi Totalmente legato al modello fisico dei dati Il RecordSet è il contenitore fondamentael dei dati RecordSet è una (1) tabella che contiene tutti I dati Se si vuole estrarre dati da più di una tabella bisogna fare un database JOIN I dati sono “flattened”: si perdono le relazioni, la navigazione è sequenziale Data types sono legati a COM/COM+ data types Data sharing via COM marshalling (serializzazione) Problemi per il marshalling attraverso I firewalls (DCOM, binary) 21 December, 2015 - slide 32 ADO vs. ADO.NET cont. ADO.NET Progettato per accessi disconnessi Può modellare I dati a livello logico! Il DataSet rimpiazza il RecordSet DataSet contiene tabelle multiple Estrarre dati da più di una tabella non richiede una JOIN Relationships sono conservate e la naviogazione è realzionale Data types sono legati solo all’XML schema Non è richiesta conversione di data type XML, come HTML, è plaintext: “Firewall friendly” 21 December, 2015 - slide 33 Benefici di ADO.NET Interoperabilità attraverso l’uso di XML Standard aperto auto descrittivo per I dati Testo leggibile (Human readable) e decifrabile Usato internamente ma accedibile anche esternamente Si può utilizzare XML per leggere, scrivere e muovere dati Scalabilità attraverso il DataSet disconnesso Le connessioni non sono mantenute per lungo tempo Database locking non avviene Supporto al Locking s con ServiceComponents Optimistic locking altrimenti Lavora alla maniera del Web: “Hit and Run!” Maintenibilità Separazione della logica dei dati dalla interfaccia utente 21 December, 2015 - slide 34 Concetti di base ed architettura Il ADO.NET Object Model Oggetti di System.Data .NET data providers ADO.NET gerarchia dei namespace Organizza il modello ad oggetti Include: System.Data System.Data.OleDb System.Data.Common System.Data.SqlClient System.Data.SqlTypes 21 December, 2015 - slide 35 ADO.NET- Namespaces ADO.NET System.Data .SqlTypes .SqlClient .Common .OleDb Class Browser per System.data e per System.data.sqlclient 21 December, 2015 - slide 36 ADO.Net – Introduzione agli oggetti Connection Usato per parlare al DB; le proprietà includono dataSource, username e password SQLConnection e OleDbConnection Command Un SQL statement o Stored Procedure SQLCommand e OleDbComand DataReader: legge solo, una vista unidirezionale dei dati (simile al ADO Recordset) DataSet – oggetto fondamentale per l’accesso ai DB DataView – vista filtrata del DataSet DataAdapter – inizializza le tabelle dei DataSet 21 December, 2015 - slide 37 Introduzione agli oggetti cont. System.Data DataSet Contiene le calssi “principali” di ADO.NET In-memory cache dei dati DataTable In-memory cache di una tabella del database DataRow Usato per manipolare una riga in un DataTable DataColumn DataRelation DataViewManager Usato per definire le colonne in un DataTable Usato per relazionare 2 DataTables tra loro Usato per creare viste su DataSets System.Data Namespace contiene I fondamenti di ADO.NET 21 December, 2015 - slide 38 DB Connection Esempio-1 <%@ Page Language="vb" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <HTML> <body> 21 December, 2015 - slide 39 DB Connection Esempio-2 <SCRIPT language="VB" runat="Server"> Sub Page_Load(Src As Object, E As EventArgs) Dim ds As DataSet Dim conn As SQLConnection Dim cmdAuthors As SQLDataAdapter Dim dv As DataView 'create a connection to the Pubs database' conn = New SQLConnection _ ("server=localhost;uid=sa;pwd=super;database=pubs") 'create a dataset with information from the authors table' cmdAuthors = New SQLDataAdapter _ ("select * from Authors", conn) ds = new DataSet() cmdAuthors.Fill(ds, "Authors") ‘Authors is the DataTable name in ds 21 December, 2015 - slide 40 DB Connection Esempio-3 'bind the first datagrid to the DefaultView of the dataset' dv = ds.Tables("Authors").DefaultView dgAuthors.DataSource = dv dgAuthors.DataBind() 'create a new DataView that is authors from California' 'and bind the second datagrid to it' dv = New DataView(ds.Tables("Authors")) dv.RowFilter = "state = 'CA'" dgCAAuthors.DataSource = dv dgCAAuthors.DataBind() End Sub </SCRIPT> 21 December, 2015 - slide 41 DB Connection Esempio-4 <h2>All Authors</H2> <ASP:DataGrid id="dgAuthors" runat="server" Width="700" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding=3 CellSpacing="0" Font-Name="Verdana" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd"/> <H2>California Authors</H2> <ASP:DataGrid id="dgCAAuthors" runat="server" /> </body> </html> 21 December, 2015 - slide 42 ADO.NET Classi DataSet DataSet DataTable DataColumn DataRow DataRelation 21 December, 2015 - slide 44 Mettendo gli Oggetti assieme… DataSet Tables DataTable DataView DataRow(s) Relations DataRelation DataColumn Constraint(s) DataViewManager DataRelation DataTable DataTable 21 December, 2015 - slide 45 Lavorare con I dati - il DataSet Un data cache in-memory dei dati da una fonte dati Un modo comune di rappresentare e manipolare dati Universal data container Non solo da usare con databases Rappresentazione logica o fisica dei dati Progetttato per essere disconnesso dalla fonte dati Connect, execute query, disconnect Può usare XML Per leggere e scrivere dati Per leggere e scrivere XMLSchema 21 December, 2015 - slide 46 Proprietà e metodi di interesse Collezioni usate per aggiungere e rimuovere tabelle e relazioni Proprietà di interesse: Tabelle: Ritornano le collezioni di oggetti DataTable Relazioni: Ritorna la collezzione di DataRelations Namespace: prende un set di namespace del DataSet Esempio di utilizzo di prorietà: myDataSet.Tables.Add( myTable ); myDataTableCollection = myDataSet.Tables 21 December, 2015 - slide 47 Il DataTable Può essere mappato ad una tabella fisica nel data source Può essere realzionato ad un’altro tramite DataRelations Impelmenta un modello di optimistic concurrency o locking Proprietà di interesse: Columns: Ritorna ColumnsCollection di DataColumns Rows: Ritorna un oggetto DataRow come una RowsCollection ParentRelations: Ritorna il RelationsCollection Constraints: Ritorna la ConstraintsCollection della tabella DataSet: Ritorna il DataSet del DataTable PrimaryKey: Prende il DataColumns che forma la chaive primaria della tabella 21 December, 2015 - slide 48 DataSet, DataRelation, Data…Views DataSet Tables DataTable DataView DataViewManager DataRow(s) Relations DataRelation DataColumn DataViewSettings Constraint(s) DataViewSetting DataRelation DataViewSetting DataTable DataTable 21 December, 2015 - slide 50 Viewing Data - il DataView Crea viste multiple sugli oggetti DataTable Collegabile ai controlli dell’interfaccia utente Proprietà di interesse: Table: Estrae o imposta la associata DataTable Sort: prende o imposta le colonne di sort della tabella e l’ordine di sort RowFilter: prende o imposta l’espressione usata per filtrare righe RowStateFilter: prende o imposta lo stato del filtro di riga None, Unchanged, New, Deleted, ModifiedCurrent, ed altri 21 December, 2015 - slide 51 Viewing + Dati - DataViewManager Simile al DataView ma DataSet oriented Usato per creare viste multiple su un DataSet Permette di settare automaticamente filtri su tabelle Proprietà di interesse: DataViewSettings: prende il DataView per ciascuna DataTable DataSet: prende o imposta il DataSet a cui applicare la view Il metodo CreateDataView Crea un DataView su un DataTable 21 December, 2015 - slide 53 Gli (ADO).NET Data Providers Una collezione di classi per accedere a fonti dati: Microsoft SQL Server™ 200x, SQL Server 7, e MSDE Qualsiasi OLE Database (OLE DB) providers Inclusi: Oracle, JET, e SQL OLE DB Providers Stabilisce connessioni tra DataSets e data stores Due .NET data providers: ADO: via il System.Data.OleDb namespace SQL Server: via il System.Data.SqlClient namespace System.Data.OleDb è il .NET data provider 21 December, 2015 - slide 55 GErarchia dei .NET Data Providers .Common Contiene classi in comune tra I due System.Data .SqlClient SqlCommand SqlConnection SqlDataReader SqlDataAdapter .OleDb OleDbCommand OleDbConnection OleDbDataReader OleDbDataAdapter 21 December, 2015 - slide 56 OleDbConnection e SqlConnection Rappresenta una sessione unica con un solo data source Crea, apre, chiude una connessione ad una fonte dati Funzionalità e metodi per gestire transazioni OleDbConnection esempio: String conStr="Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=NWIND_RW.MDB"; OleDbConnection aConn = new OleDbConnection(conStr); aConn.Open(); // Execute Queries using OleDbDataAdapter Class aConn.Close(); 21 December, 2015 - slide 57 Relational Databases Stored Procedure Esempio CREATE PROCEDURE CustOrderHist @CustomerID nchar(5) AS SELECT ProductName, Total=SUM(Quantity) FROM Products P, [Order Details] OD, Orders O, Customers C WHERE C.CustomerID = @CustomerID AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID GROUP BY ProductName 21 December, 2015 - slide 58 ADO.NET Classi System.Data.SqlClient Namespace Managed provider nativo per SQL Server Costruito su TDS (Tabular Data Stream) per ottenere alte performance in SQL Server SqlConnection, SqlCommand e SqlDataReader classes Classi per Error handling Connection pooling (implicitamente abilitate per default ) System.Data.SqlTypes fornisce classi per data types nativi di SQL Server 21 December, 2015 - slide 60 ADO.NET Classi DataSet Esempio string sConnString = “Persist Security Info=False;” + “User ID=sa;Initial Catalog=Northwind;” + “Data Source=MYSERVER”; SqlConnection conn = new SqlConnection(sConnString); conn.Open(); string sQueryString = “SELECT CompanyName FROM Customers”; SqlDataAdapter myDSAdapter = new SqlDataAdapter(); DataSet myDataSet = new DataSet(); myDSAdapter.SelectCommand = new SqlCommand(sQueryString, conn); myDSAdapter.Fill(myDataSet); conn.Close(); 21 December, 2015 - slide 61