ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è...

23
1 1 Vittorio Maniezzo - Università di Bologna ADO.NET 2 Vittorio Maniezzo - Università di Bologna ADO.NET Prima ODBC (Open Database Connectivity) Assicura interoperabilità con molti DBMS API molto comuni Usa SQL come linguaggio di accesso ai dati OLE DB Ampio accesso a dati, relazionali e altro Interfaccia di basso livello (C++), sviluppato come COM Non limitato a SQL per leggere dati Può usare driver ODBC ADO (ActiveX Data Objects) Interfaccia semplice component-based, object-oriented Fornisce una modalità di programmazione alle OLE DB utilizzabile al di fuori del C++

Transcript of ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è...

Page 1: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

1

1Vittorio Maniezzo - Università di Bologna

ADO.NET

2Vittorio Maniezzo - Università di Bologna

ADO.NET Prima

ODBC (Open Database Connectivity)• Assicura interoperabilità con molti DBMS• API molto comuni• Usa SQL come linguaggio di accesso ai dati

OLE DB• Ampio accesso a dati, relazionali e altro• Interfaccia di basso livello (C++), sviluppato come COM• Non limitato a SQL per leggere dati• Può usare driver ODBC

ADO (ActiveX Data Objects)• Interfaccia semplice component-based, object-oriented• Fornisce una modalità di programmazione alle OLE DB utilizzabile al di fuori del C++

Page 2: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

2

3Vittorio Maniezzo - Università di Bologna

ADO.NET Prima

ADO

ODBC ProviderODBC ProviderODBC ProviderODBC Provider Simple ProviderSimple ProviderSimple ProviderSimple Provider Native ProviderNative ProviderNative ProviderNative Provider

OLE DB OLE DB OLE DB OLE DB ProviderProviderProviderProvider

ODBCODBCODBCODBC

ODBC DriverODBC DriverODBC DriverODBC Driver

TextTextTextTextFileFileFileFile

DatabaseDatabaseDatabaseDatabase DatabaseDatabaseDatabaseDatabase

OLE DB OLE DB OLE DB OLE DB ProviderProviderProviderProvider

MainframeMainframeMainframeMainframe

OLE DB

Applicazione utente

4Vittorio Maniezzo - Università di Bologna

ADO.NET Prima

ADO è stato pensato come modello connesso, tightly coupled

• Appropriato per architetture client/server

Principalmente relazionale (non gerarchico come XML)

Gli oggetti non sono ben strutturati

• Molti modi di fare la stessa cosa

• Troppe funzinalità in ogni oggetto

Non era pensato per ambienti distribuiti, n-tier

Page 3: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

3

5Vittorio Maniezzo - Università di Bologna

ADO.NET Cosè ADO.NET?

ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso ai dati all’interno del .NET Framework

•Queste collezioni sono organizzate in namespace:

•System.Data, System.Data, System.Data, System.Data,

System.Data.OleDb, System.Data.OleDb, System.Data.OleDb, System.Data.OleDb,

System.Data.SqlClientSystem.Data.SqlClientSystem.Data.SqlClientSystem.Data.SqlClient, etc.

ADO .NET è un’evoluzione di ADO.

6Vittorio Maniezzo - Università di Bologna

ADO.NET Obiettivi

•Scalabile, grazie a un modello progettuale non connesso

•Ricco supporto XML (sia gerarchico che relazionale)

•Accesso a dati su HTTP

•Mantiene il modello di programmazione di ADO

Page 4: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

4

7Vittorio Maniezzo - Università di Bologna

SQL Managed ProviderSQL Managed ProviderSQL Managed ProviderSQL Managed Provider

SQL ServerSQL ServerSQL ServerSQL ServerDatabaseDatabaseDatabaseDatabase

ADO.NET Managed Providers

ADO.NET Managed Provider

ADO Managed ProviderADO Managed ProviderADO Managed ProviderADO Managed Provider

OLE DB OLE DB OLE DB OLE DB ProviderProviderProviderProvider

DatabaseDatabaseDatabaseDatabase

Applicazione utente

8Vittorio Maniezzo - Università di Bologna

DataSet

SQL Server .NET Data Provider

OLE DB .NET Data Provider

SQL Server OLEDB source

Un data provider .net è un insieme di classi che servono a connettersi a una sorgente dati per ottenerne e modificarne i dati.

Managed Provider

Page 5: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

5

9Vittorio Maniezzo - Università di Bologna

Oggetti di un data provider

Oggetto Descrizione

Connection Stabilisce una connessione con una specifica sorgente dati.

Command Esegue un comando sulla sorgent dati. Espone dei Parameters e accetta Transaction da una Connection.

DataReader Legge uno stream di dati forward-only, read-only da una sorgente dati.

DataAdapter Riempie un DataSet e gestisce gli aggiornamenti con la sorgente dati.

10Vittorio Maniezzo - Università di Bologna

ADO.NET Accesso ai dati

Connesso: Forward-only, read-only

• L’applicazione invia query, poi legge i risultati e li elabora

• Oggetto DataReaderDataReaderDataReaderDataReader

Disconnesso

• L’applicazione invia query, poi memorizza i risultati per una successiva elaborazione

• Minimizza il tempo di connessione col database

• Oggetto DataSetDataSetDataSetDataSet

Page 6: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

6

11Vittorio Maniezzo - Università di Bologna

Architettura

DataSet

Command

ConnectionConnection

Command

DataReader

DBMS

Strutture dati personali

ManagedData

Provider

Data Store

12Vittorio Maniezzo - Università di Bologna

Architettura

Page 7: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

7

13Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Namespace System.DataSystem.DataSystem.DataSystem.Data

Contiene le classi di base di ADO.NET

Fondamentale è DataSetDataSetDataSetDataSet (disconnesso)

Supporta tutti i tipi di applicazioni

• Internet

•ASP.NET

•XML

• Windows forms

Contiene classi usate o derivate da managed providers

IDbConnectionIDbConnectionIDbConnectionIDbConnection, IDbCommandIDbCommandIDbCommandIDbCommand, IDbDataReaderIDbDataReaderIDbDataReaderIDbDataReader

14Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Namespace System.Data.OleDbSystem.Data.OleDbSystem.Data.OleDbSystem.Data.OleDb

Managed provider in aggiunta ai provider OLEDB

• SQLOLEDB (SQL Server) — usa System.Data.SQL

• MSDAORA (Oracle)

• JOLT (Jet)

• OLEDB for ODBC providers

Classi OleDbConnectionOleDbConnectionOleDbConnectionOleDbConnection, OleDbCommandOleDbCommandOleDbCommandOleDbCommand e OleDbDataReaderOleDbDataReaderOleDbDataReaderOleDbDataReader

Classi per la gestione delle connessioni

Classi per la gestione degli errori

Page 8: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

8

15Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Namespace System.Data.SqlClientSystem.Data.SqlClientSystem.Data.SqlClientSystem.Data.SqlClient

Managed provider nativo per SQL Server

Classi SqlConnectionSqlConnectionSqlConnectionSqlConnection, SqlCommandSqlCommandSqlCommandSqlCommand e SqlDataReaderSqlDataReaderSqlDataReaderSqlDataReader

Classi per

• Error handling

• Connection pooling

System.Data.SqlTypesSystem.Data.SqlTypesSystem.Data.SqlTypesSystem.Data.SqlTypes contiene le classi per i tipi di dati SQL Server nativi

16Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Interfaccia IDbConnectionIDbConnectionIDbConnectionIDbConnection

Crea una sessione unica con una sorgente dati

Implementata da SqlDbConnectionSqlDbConnectionSqlDbConnectionSqlDbConnection e OleDbConnectionOleDbConnectionOleDbConnectionOleDbConnection

Funzionalità

• Open, close di connessioni

• Inizio di transazioni

•IDbTransactionIDbTransactionIDbTransactionIDbTransaction fornisce metodi CommitCommitCommitCommite RollbackRollbackRollbackRollback

Usata assieme agli oggetti IDbCommandIDbCommandIDbCommandIDbCommand e IDataAdapterIDataAdapterIDataAdapterIDataAdapter

Page 9: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

9

17Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Interfaccia IDbCommandIDbCommandIDbCommandIDbCommand

Rappresenta una istruzione da inviare alla sorgente dati di solito, ma non necessariamente, SQL

Implementata da OleDbCommandOleDbCommandOleDbCommandOleDbCommand e SqlCommandSqlCommandSqlCommandSqlCommand

Funzionalità

• Definisce l’istruzione da eseguire

• Esegue l’istruzione

• Passa e riceve parametri

ExecuteReaderExecuteReaderExecuteReaderExecuteReader ritorna le righe,

ExecuteNonQueryExecuteNonQueryExecuteNonQueryExecuteNonQuery non ritorna niente,

ExecuteScalarExecuteScalarExecuteScalarExecuteScalar ritorna un singolo valore

18Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Interfaccia IDataReaderIDataReaderIDataReaderIDataReader

Accesso forward-only, read-only a stream di dati

Implementata da SqlDataReaderSqlDataReaderSqlDataReaderSqlDataReader e OleDbDataReaderOleDbDataReaderOleDbDataReaderOleDbDataReader

Creata col metodo ExecuteReaderExecuteReaderExecuteReaderExecuteReader di IDbCommandIDbCommandIDbCommandIDbCommand

Le operazioni sull’oggetto associato IDbConnectionIDbConnectionIDbConnectionIDbConnection sono bloccate finchè il reader non viene chiuso

Page 10: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

10

19Vittorio Maniezzo - Università di Bologna

DBMS

ADO.NET, utilizzo connesso

In un contesto connesso, le risorse sono mantenute sul server finchè non viene chusa la connessione

Operazioni

1. Apri la connessione

2. Esegui un comando

3. Elabora le righe nel reader

4. Chiudi il reader

5. Chiudi la connessione

OleDbConnection

OleDbCommand

OleDbDataReader

20Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Esempio DataReaderDataReaderDataReaderDataReader (SQLserver)

string sConnString = “Provider=SQLOLEDB.1;” +string sConnString = “Provider=SQLOLEDB.1;” +string sConnString = “Provider=SQLOLEDB.1;” +string sConnString = “Provider=SQLOLEDB.1;” +

“User ID=sa;Initial Catalog=Northwind;” +“User ID=sa;Initial Catalog=Northwind;” +“User ID=sa;Initial Catalog=Northwind;” +“User ID=sa;Initial Catalog=Northwind;” +

“Data Source=MYSERVER”;“Data Source=MYSERVER”;“Data Source=MYSERVER”;“Data Source=MYSERVER”;

OleDbConnection conn = new OleDbConnection(sConnString);OleDbConnection conn = new OleDbConnection(sConnString);OleDbConnection conn = new OleDbConnection(sConnString);OleDbConnection conn = new OleDbConnection(sConnString);

conn.Open();conn.Open();conn.Open();conn.Open();

string sQueryString = “SELECT CompanyName FROM Customers”;string sQueryString = “SELECT CompanyName FROM Customers”;string sQueryString = “SELECT CompanyName FROM Customers”;string sQueryString = “SELECT CompanyName FROM Customers”;

OleDbCommand myCommand = new OleDbCommand(sQueryString, conn);OleDbCommand myCommand = new OleDbCommand(sQueryString, conn);OleDbCommand myCommand = new OleDbCommand(sQueryString, conn);OleDbCommand myCommand = new OleDbCommand(sQueryString, conn);

OleDbDataReader myReader = myCommand.ExecuteReader();OleDbDataReader myReader = myCommand.ExecuteReader();OleDbDataReader myReader = myCommand.ExecuteReader();OleDbDataReader myReader = myCommand.ExecuteReader();

while (myReader.Read())while (myReader.Read())while (myReader.Read())while (myReader.Read())

{ Console.WriteLine(myReader.GetString(0));{ Console.WriteLine(myReader.GetString(0));{ Console.WriteLine(myReader.GetString(0));{ Console.WriteLine(myReader.GetString(0));

}}}}

myReader.Close();myReader.Close();myReader.Close();myReader.Close();

conn.Close();conn.Close();conn.Close();conn.Close();

Page 11: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

11

21Vittorio Maniezzo - Università di Bologna

Stringhe connessione(v. http://www.connectionstrings.com/)

MYSQL

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

Esempio

MyConString = "SERVER=localhost; DATABASE=testDB; UID=root; PASSWORD=quelCheLé;";

SqLite

Data Source=filename;Version=3;

Esempio

connString = @"Data Source="+dbpath+";UTF8Encoding=True;Version=3";

Access

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;User Id=admin;Password=;

Esempio

connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+mdbPath+";";

22Vittorio Maniezzo - Università di Bologna

Classi ADO.NET DataSetDataSetDataSetDataSet

• E’ una collezione di tabelle

• Non conosce la sorgente dei dati

• Gestisce le relazioni fra le tabelle

• Potente interfaccia di programmazione (ha oggetti per tabelle, colonne, relazioni, ecc)

• Ricorda lo stato originale e corrente dei dati

• Può modificare dati e metadati

• Il formato di serializzazione nativo è XML

Page 12: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

12

23Vittorio Maniezzo - Università di Bologna

Classi ADO.NET DataSetDataSetDataSetDataSet

DataSetDataSetDataSetDataSet

DataTableDataTableDataTableDataTable

DataRelationDataRelationDataRelationDataRelation

DataRowDataRowDataRowDataRow

DataColumnDataColumnDataColumnDataColumn

24Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Interfaccia IDataAdapterIDataAdapterIDataAdapterIDataAdapter

•Riempie o aggiorna un DataSetDataSetDataSetDataSet

• Implementata da OleDbDataAdapterOleDbDataAdapterOleDbDataAdapterOleDbDataAdapter e SqlDataAdapterSqlDataAdapterSqlDataAdapterSqlDataAdapter

•Non connection-based

•Contiene 4 oggetti predefiniti per operazionisul dataset: Select, Insert, Update e Delete

Page 13: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

13

25Vittorio Maniezzo - Università di Bologna

ADO.NET utilizzo disconnessoIn un contesto disconnesso, le

risorse NON sono gestite sulserver quado i dati vengonoelaborati

Operazioni

• Apri la connessioni

• Riempi il DataSet

• Chiudi la connessione

• Elabora il DataSet

• Apri la connessione

• Aggiorna la sorgente dati

• Chiudi la connessione

OleDbConnection

OleDbDataAdapter

DataSet

DBMS

26Vittorio Maniezzo - Università di Bologna

Classi ADO.NET Esempio DataSet DataSet DataSet DataSet (Sqlserver)

string sConnString = “Persist Security Info=False;” +string sConnString = “Persist Security Info=False;” +string sConnString = “Persist Security Info=False;” +string sConnString = “Persist Security Info=False;” +

“User ID=sa;Initial Catalog=Northwind;” +“User ID=sa;Initial Catalog=Northwind;” +“User ID=sa;Initial Catalog=Northwind;” +“User ID=sa;Initial Catalog=Northwind;” +

“Data Source=MYSERVER”;“Data Source=MYSERVER”;“Data Source=MYSERVER”;“Data Source=MYSERVER”;

SqlConnection conn = new SqlConnection(sConnString);SqlConnection conn = new SqlConnection(sConnString);SqlConnection conn = new SqlConnection(sConnString);SqlConnection conn = new SqlConnection(sConnString);

conn.Open();conn.Open();conn.Open();conn.Open();

string sQueryString = “SELECT CompanyName FROM Customers”;string sQueryString = “SELECT CompanyName FROM Customers”;string sQueryString = “SELECT CompanyName FROM Customers”;string sQueryString = “SELECT CompanyName FROM Customers”;

SqlDataAdapter myDSAdapter = new SqlDataAdapter();SqlDataAdapter myDSAdapter = new SqlDataAdapter();SqlDataAdapter myDSAdapter = new SqlDataAdapter();SqlDataAdapter myDSAdapter = new SqlDataAdapter();

DataSet myDataSet = new DataSet();DataSet myDataSet = new DataSet();DataSet myDataSet = new DataSet();DataSet myDataSet = new DataSet();

myDSAdapter.SelectCommand = new SqlCommand(sQueryString, conn);myDSAdapter.SelectCommand = new SqlCommand(sQueryString, conn);myDSAdapter.SelectCommand = new SqlCommand(sQueryString, conn);myDSAdapter.SelectCommand = new SqlCommand(sQueryString, conn);

myDSAdapter.Fill(myDataSet);myDSAdapter.Fill(myDataSet);myDSAdapter.Fill(myDataSet);myDSAdapter.Fill(myDataSet);

conn.Close();conn.Close();conn.Close();conn.Close();

Page 14: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

14

27Vittorio Maniezzo - Università di Bologna

Classi ADO.NET DataTableDataTableDataTableDataTable

Oggetto in memoria che rappresenta una tabella

• Colonne

• Righe

Schema definito dalla collection ColumnsColumnsColumnsColumns

Integrità dati gestita dall’oggetto ConstraintConstraintConstraintConstraint

Eventi pubblici

• Modifica/cancellazione righe

• Modifica colonne

28Vittorio Maniezzo - Università di Bologna

Classi ADO.NET DataColumnDataColumnDataColumnDataColumn

Elemento fondamentale di un DataTableDataTableDataTableDataTable(contenuto nella collection ColumnsColumnsColumnsColumns)

Definisce quali tipi di dati possono entrare (per mezzo della proprietà DataTypeDataTypeDataTypeDataType)

Altre proprietà: AllowNullAllowNullAllowNullAllowNull, UniqueUniqueUniqueUnique e ReadOnlyReadOnlyReadOnlyReadOnly

Può contenere ConstraintsConstraintsConstraintsConstraints (una collection su DataTableDataTableDataTableDataTable)

Può contenere RelationsRelationsRelationsRelations (collection su DataSetDataSetDataSetDataSet)

Page 15: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

15

29Vittorio Maniezzo - Università di Bologna

Classi ADO.NET DataRowDataRowDataRowDataRow

Rappresenta i dati in una DataTableDataTableDataTableDataTable(contenuto nella collection RowsRowsRowsRows)

Conforme allo schema definito da DataColumns

Proprietà per determinare lo stato di una riga (new, changed, deleted ecc.)

30Vittorio Maniezzo - Università di Bologna

Classi ADO.NET DataRelationDataRelationDataRelationDataRelation

Correla due DataTablesDataTablesDataTablesDataTables via DataColumnsDataColumnsDataColumnsDataColumns

I valori di DataTypeDataTypeDataTypeDataType delle due DataColumnsDataColumnsDataColumnsDataColumnsdevono essere identici

Le modifiche non corrispondenti alla relazione sono proibite

Page 16: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

16

31Vittorio Maniezzo - Università di Bologna

DataSet

DataRelation

DataRelationCollection

DataTableCollection

DataSet

DataTable

DataRowCollection

DataColumnCollection

DataView

DataRow

DataColumn

32Vittorio Maniezzo - Università di Bologna

La classe DataSetUn DataSets consiste di una o più tabelle da:

• Uno o più data adapter.

• Creazione da programma.

• XML.

• Altri DataSets.

Le tabelle contengono colonne, vincoli, e righe.

• Il concetto di “riga corrente” non esiste.

• Tutto è una collection!

DataRow

DataColumn

DataTable

DataRelation Constraints

Page 17: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

17

33Vittorio Maniezzo - Università di Bologna

Membri classe DataSet

Clear Clears the DataSet of any data by removing all rows in all tables.

Clone Copies the structure of the DataSet, including all DataTable schemas, relations, and constraints. Does not copy any data.

Copy Copies both the structure and data for this DataSet.

Merge Merges this DataSet with a specified DataSet.

34Vittorio Maniezzo - Università di Bologna

Membri classe DataSet

AcceptChanges Commits all the changes made to this DataSet since it was loaded or the last time AcceptChanges was called.

RejectChanges Rolls back all the changes made to the DataSet since it was created, or since the last time DataSet.AcceptChanges was called.

GetChanges Gets a copy of the DataSet containing all changes made to it since it was last loaded, or since AcceptChanges was called.

HasChanges Gets a value indicating whether the DataSet has changes, including new, deleted, or modified rows.

Page 18: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

18

35Vittorio Maniezzo - Università di Bologna

Membri classe DataSet

GetXml Returns the XML representation of the data stored in the DataSet.

GetXmlSchema Returns the XSD schema for the XML representation of the data stored in the DataSet.

ReadXml Reads XML schema and data into the DataSet.

ReadXmlSchema Reads an XML schema into the DataSet.

WriteXml Writes XML data, and optionally the schema, from the DataSet.

WriteXmlSchema Writes the DataSet structure as an XML schema.

36Vittorio Maniezzo - Università di Bologna

DataSet: creazione tabella

DataSet ds = new DataSet("DynamicDS");

ds.Tables.Add(“Ordini");

ds.Tables["Ordini"].Columns.Add("OrderID",

Type.GetType("System.Int32"));

ds.Tables["Ordini"].Columns.Add("CustomerFirstName",

Type.GetType("System.String"));

ds.Tables["Ordini"].Columns.Add("Data",

Type.GetType("System.DateTime"));

ds.Tables.Add(“RigheOrdine”);

Page 19: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

19

37Vittorio Maniezzo - Università di Bologna

DataSet: aggiunta dato

DataRow newRow;

newRow = ds.Tables["Ordini"].NewRow();

newRow["OrderID"] = 101;

newRow["CustomerFirstName"] = “Giovanni";

newRow["CustomerLastName"] = "Ducci";

newRow["Date"] = new DateTime(2009, 5, 1);

m_ds.Tables["Ordini"].Rows.Add(newRow);

38Vittorio Maniezzo - Università di Bologna

Lettura DataTable

DataTable myTable = ds.Tables[“RigheOrdine"];

foreach (DataColumn c in myTable.Columns)

{ Console.Write(c.ColumnName + "\t");

}

Console.WriteLine("");

foreach (DataRow r in myTable.Rows)

{ foreach (DataColumn c in myTable.Columns)

{ Console.Write(r[c] + "\t");

}

Console.WriteLine("");

}

Page 20: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

20

39Vittorio Maniezzo - Università di Bologna

Aggiunta di una colonna

Colonna normale:

ds.Tables["Ordini"].Columns.Add("OrderID",

Type.GetType("System.Int32"));

Colonna calcolata:

workTable.Columns.Add("Totale", typeof(Double));

workTable.Columns.Add(“Tasse",typeof(Double),"Total*0.086);

workTable.Columns.Add(“Totalone",typeof(Double),"Max(Total)");

40Vittorio Maniezzo - Università di Bologna

Aggiunta di una colonna

Colonna AutoIncrementata:

DataColumn workColumn =

workTable.Columns.Add("CustomerID",typeof(Int32));

workColumn.AutoIncrement = true;

workColumn.AutoIncrementSeed = 200;

workColumn.AutoIncrementStep = 3;

Page 21: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

21

41Vittorio Maniezzo - Università di Bologna

Primary Key

workTable.PrimaryKey = new DataColumn[]

{workTable.Columns["CustLName"],

workTable.Columns["CustFName"]};

Oppure

DataColumn[] myKey = new DataColumn[2];

myKey[0] = workTable.Columns["CustLName"];

myKey[1] = workTable.Columns["CustFName"];

workTable.PrimaryKey = myKey;

42Vittorio Maniezzo - Università di Bologna

DataRelation e Constraint

DataColumn parentCol =

m_ds.Tables["Ordini"].Columns["OrderID"];

DataColumn childCol =

m_ds.Tables[“RigheOrdine"].Columns["fk_OrderID"];

// Crea e aggiunge la relazione

m_ds.Relations.Add(new DataRelation("Ordini_RigheOrdine",

parentCol, //primary key

childCol));

InsertOrderDetailRecord(103, "Item-200", 9, "140.77");

Page 22: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

22

43Vittorio Maniezzo - Università di Bologna

Vincolo UniqueIl vincolo unique assicura che tutti i dati nella/e colonna/e

specificata/e sono unici per riga.

Una DataTable.PrimaryKey è unique.

DataColumn[] myColumns = new DataColumn[2];

myColumns[0] = myTable.Columns["id"];

myColumns[1] = myTable.Columns["Name"];

UniqueConstraint myUC = new UniqueConstraint("idNameConstrnt",

myColumns, false);

myTable.Constraints.Add(myUC);

44Vittorio Maniezzo - Università di Bologna

Vincolo ForeignKey

Un ForeignKeyConstraint impone regole su come vengono

propagati gli update e i delete a tabelle correlate.

ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint

("Order_OrderDetail",

m_ds.Tables["Ordini"].Columns["OrderID"],

m_ds.Tables[“RigheOrdine"].Columns["fk_OrderID"]));

custOrderFK.DeleteRule = Rule.None;

custDS.Tables[“RigheOrdine"].Constraints.Add(custOrderFK);

Non si può cancellare un ordine che ha associato delle righe d’ordine.

Page 23: ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso

23

45Vittorio Maniezzo - Università di Bologna

DataView

Una DataView permette di creare viste diverse

sui dati memorizzati in una DataTable.

Con una DataView si possono visualizzare i

dati di una tabella con ordinamenti diversi, o

filtrarli in base ai loro valori.

46Vittorio Maniezzo - Università di Bologna

DataView

DataTable Cart = new DataTable();

Cart = (DataTable)Session["ShoppingCart"]; // riempito prima

DataView CartView = new DataView(Cart);

CartView.Sort="Item";

CartView.RowFilter = "Item='" + item + "'";

if (CartView.Count > 0)

CartView.Delete(0);

CartView.RowFilter = "";

dg.DataSource = CartView; // per collegare a un dataGridView