ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è...
Transcript of ADO - unibo.itisi-personale.csr.unibo.it/.../ProgrGIS/ADO.NET.pdfADO.NET Cosè ADO.NET? ADO.NET è...
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++
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
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
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
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
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
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
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
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
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();
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
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
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();
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)
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
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
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.
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”);
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("");
}
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;
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");
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.
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