27
ADO .NET Primer ADO .NET Primer Andrea Saltarello Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l. http:// blogs.ugidotnet.org / pape

ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Embed Size (px)

Citation preview

Page 1: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

ADO .NET PrimerADO .NET PrimerADO .NET PrimerADO .NET Primer

Andrea SaltarelloAndrea SaltarelloSoftware Architect – Software Architect – Managed Designs S.r.l.http://blogs.ugidotnet.org/pape

Page 2: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

SponsorSponsor

Page 3: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Struttura di ADO .NETStruttura di ADO .NETStruttura di ADO .NETStruttura di ADO .NET

ADO .NET è composto da:ADO .NET è composto da:– Namespace Namespace System.DataSystem.Data: racchiude le primitive : racchiude le primitive

indipendenti dalla tipologia di base dati. indipendenti dalla tipologia di base dati. • Sono tutte disconnesseSono tutte disconnesse

– .NET Managed Provider: implementano le primitive .NET Managed Provider: implementano le primitive necessarie all’accesso a necessarie all’accesso a specifiche specifiche basi datibasi dati

• System.Data.SqlClientSystem.Data.SqlClient per l’accesso a SQL Server 7+ per l’accesso a SQL Server 7+• System.Data.OleDbSystem.Data.OleDb per connettersi usando un OleDb per connettersi usando un OleDb

Provider Provider • System.Data.OracleClientSystem.Data.OracleClient• System.Data.OdbcSystem.Data.Odbc

Page 4: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

.NET Data Providers.NET Data Providers .NET Data Providers.NET Data Providers

Implementano un insieme comune di Implementano un insieme comune di interfacce esponendo le classi:interfacce esponendo le classi:– Connection: permette la connessione ad una Connection: permette la connessione ad una

base datibase dati– Command: permette l’esecuzione di comandi Command: permette l’esecuzione di comandi

SQL e SQL e Stored ProcedureStored Procedure– DataReader: implementa un cursore DataReader: implementa un cursore forward-forward-

only, read-only, client sideonly, read-only, client side– DataAdapter: permette di “riempire” un DataAdapter: permette di “riempire” un

contenitore disconnessocontenitore disconnesso

Implementano un insieme comune di Implementano un insieme comune di interfacce esponendo le classi:interfacce esponendo le classi:– Connection: permette la connessione ad una Connection: permette la connessione ad una

base datibase dati– Command: permette l’esecuzione di comandi Command: permette l’esecuzione di comandi

SQL e SQL e Stored ProcedureStored Procedure– DataReader: implementa un cursore DataReader: implementa un cursore forward-forward-

only, read-only, client sideonly, read-only, client side– DataAdapter: permette di “riempire” un DataAdapter: permette di “riempire” un

contenitore disconnessocontenitore disconnesso

Page 5: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Classe ConnectionClasse ConnectionClasse ConnectionClasse Connection

Simile ad ADO Simile ad ADO old-styleold-styleLa Connection String:La Connection String:

– Può essere specificata mediante un Può essere specificata mediante un costruttore costruttore parametricoparametrico

– Utilizza le stesse keyword di ADODBUtilizza le stesse keyword di ADODB– Richiede attenzione nella specifica del Richiede attenzione nella specifica del Provider:Provider:

• SqlClient SqlClient nonnon lo accetta lo accetta • System.Data.OleDb non supporta ODBCSystem.Data.OleDb non supporta ODBC

Simile ad ADO Simile ad ADO old-styleold-styleLa Connection String:La Connection String:

– Può essere specificata mediante un Può essere specificata mediante un costruttore costruttore parametricoparametrico

– Utilizza le stesse keyword di ADODBUtilizza le stesse keyword di ADODB– Richiede attenzione nella specifica del Richiede attenzione nella specifica del Provider:Provider:

• SqlClient SqlClient nonnon lo accetta lo accetta • System.Data.OleDb non supporta ODBCSystem.Data.OleDb non supporta ODBC

Dim conSQL As New SqlConnection( )conSQL.ConnectionString = "Integrated Security=True;" & _

"Data Source=LocalHost;Initial Catalog=Pubs;"conSQL.Open( )

Dim conSQL As New SqlConnection( )conSQL.ConnectionString = "Integrated Security=True;" & _

"Data Source=LocalHost;Initial Catalog=Pubs;"conSQL.Open( )

Page 6: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Classe CommandClasse CommandClasse CommandClasse Command

Possiamo creare un comando:Possiamo creare un comando:– Mediante il costruttoreMediante il costruttore– Mediante metodo Mediante metodo CreateCommandCreateCommand

Possiamo eseguire un comando mediante i metodi:Possiamo eseguire un comando mediante i metodi:– ExecuteReaderExecuteReader: restituisce il DataReader in base ad una : restituisce il DataReader in base ad una

queryquery– ExecuteScalarExecuteScalar: è il metodo preferibile se il risultato è un : è il metodo preferibile se il risultato è un

singletonsingleton– ExecuteNonQueryExecuteNonQuery: esegue un comando di azione: esegue un comando di azione

Possiamo creare un comando:Possiamo creare un comando:– Mediante il costruttoreMediante il costruttore– Mediante metodo Mediante metodo CreateCommandCreateCommand

Possiamo eseguire un comando mediante i metodi:Possiamo eseguire un comando mediante i metodi:– ExecuteReaderExecuteReader: restituisce il DataReader in base ad una : restituisce il DataReader in base ad una

queryquery– ExecuteScalarExecuteScalar: è il metodo preferibile se il risultato è un : è il metodo preferibile se il risultato è un

singletonsingleton– ExecuteNonQueryExecuteNonQuery: esegue un comando di azione: esegue un comando di azione

Dim commSQL As New SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText = "Select Count(*) from Authors"MessageBox.Show(commSQL.ExecuteScalar( ).ToString)

Dim commSQL As New SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText = "Select Count(*) from Authors"MessageBox.Show(commSQL.ExecuteScalar( ).ToString)

Page 7: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Invocare Stored ProcedureInvocare Stored ProcedureInvocare Stored ProcedureInvocare Stored Procedure

1.1. Creare un oggetto Creare un oggetto CommandCommand2.2. Impostare Impostare CommandTypeCommandType al valore al valore

StoredProcedureStoredProcedure3.3. Impostare la proprietà Impostare la proprietà CommandTextCommandText4.4. Usare il metodo Usare il metodo AddAdd per creare e aggiungere per creare e aggiungere

parametriparametri5.5. Impostare la proprietà Impostare la proprietà ParameterDirectionParameterDirection6.6. Invocare Invocare ExecuteReaderExecuteReader7.7. Consumare i record, e chiudere il Consumare i record, e chiudere il DataReaderDataReader8.8. Leggere i parametri di output e il valore di Leggere i parametri di output e il valore di

ritornoritorno

1.1. Creare un oggetto Creare un oggetto CommandCommand2.2. Impostare Impostare CommandTypeCommandType al valore al valore

StoredProcedureStoredProcedure3.3. Impostare la proprietà Impostare la proprietà CommandTextCommandText4.4. Usare il metodo Usare il metodo AddAdd per creare e aggiungere per creare e aggiungere

parametriparametri5.5. Impostare la proprietà Impostare la proprietà ParameterDirectionParameterDirection6.6. Invocare Invocare ExecuteReaderExecuteReader7.7. Consumare i record, e chiudere il Consumare i record, e chiudere il DataReaderDataReader8.8. Leggere i parametri di output e il valore di Leggere i parametri di output e il valore di

ritornoritorno

Page 8: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Invocare Stored Procedure: un Invocare Stored Procedure: un esempioesempio

Invocare Stored Procedure: un Invocare Stored Procedure: un esempioesempio

Page 9: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Usare un DataReaderUsare un DataReaderUsare un DataReaderUsare un DataReader

Per usare un DataReader, possiamo:Per usare un DataReader, possiamo:– Avanzare alla posizione successiva mediante il Avanzare alla posizione successiva mediante il

metodo metodo Read()Read(), che ritorna True finchè non si sono , che ritorna True finchè non si sono consumati tutti i daticonsumati tutti i dati

– Leggere i valori dei campi mediante la proprietà Item, Leggere i valori dei campi mediante la proprietà Item, oppure mediante i metodi oppure mediante i metodi GetGetXYZXYZ()()

Un DataReader impegna la propria connessione, Un DataReader impegna la propria connessione, quindi:quindi:– Non è possibile utilizzarla per eseguire comandiNon è possibile utilizzarla per eseguire comandi– Dobbiamo ricordarci di chiuderlo mediante il metodo Dobbiamo ricordarci di chiuderlo mediante il metodo

Close()Close()

Per usare un DataReader, possiamo:Per usare un DataReader, possiamo:– Avanzare alla posizione successiva mediante il Avanzare alla posizione successiva mediante il

metodo metodo Read()Read(), che ritorna True finchè non si sono , che ritorna True finchè non si sono consumati tutti i daticonsumati tutti i dati

– Leggere i valori dei campi mediante la proprietà Item, Leggere i valori dei campi mediante la proprietà Item, oppure mediante i metodi oppure mediante i metodi GetGetXYZXYZ()()

Un DataReader impegna la propria connessione, Un DataReader impegna la propria connessione, quindi:quindi:– Non è possibile utilizzarla per eseguire comandiNon è possibile utilizzarla per eseguire comandi– Dobbiamo ricordarci di chiuderlo mediante il metodo Dobbiamo ricordarci di chiuderlo mediante il metodo

Close()Close()

Page 10: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Usare un DataReader: un Usare un DataReader: un esempioesempio

Usare un DataReader: un Usare un DataReader: un esempioesempio

Dim commSQL As New SqlClient.SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText ="Select au_lname,au_fname from authors"Dim datRead As SqlClient.SqlDataReaderdatRead = commSQL.ExecuteReader( )Do Until datRead.Read = False

MessageBox.Show(datRead.GetString(1) & " " _& datRead.GetString(0))

Loop datRead.Close( )

Dim commSQL As New SqlClient.SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText ="Select au_lname,au_fname from authors"Dim datRead As SqlClient.SqlDataReaderdatRead = commSQL.ExecuteReader( )Do Until datRead.Read = False

MessageBox.Show(datRead.GetString(1) & " " _& datRead.GetString(0))

Loop datRead.Close( )

Page 11: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

DataReaderDataReaderDataReaderDataReader

Page 12: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

La classe DataSetLa classe DataSetLa classe DataSetLa classe DataSet

• E’ un contenitore disconnessoE’ un contenitore disconnesso• E’ assimilabile ad un “vettore di matrici”E’ assimilabile ad un “vettore di matrici”• Permette di specificare vincoli e relazioni Permette di specificare vincoli e relazioni

tra i dati contenutitra i dati contenuti• E’ accessibile in scritturaE’ accessibile in scrittura• Permette di propagare le modifiche su un Permette di propagare le modifiche su un

DBDB• Supporta nativamente la Supporta nativamente la

(de)serializzazione in formato XML(de)serializzazione in formato XML

• E’ un contenitore disconnessoE’ un contenitore disconnesso• E’ assimilabile ad un “vettore di matrici”E’ assimilabile ad un “vettore di matrici”• Permette di specificare vincoli e relazioni Permette di specificare vincoli e relazioni

tra i dati contenutitra i dati contenuti• E’ accessibile in scritturaE’ accessibile in scrittura• Permette di propagare le modifiche su un Permette di propagare le modifiche su un

DBDB• Supporta nativamente la Supporta nativamente la

(de)serializzazione in formato XML(de)serializzazione in formato XML

Page 13: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

La classe DataSetLa classe DataSetLa classe DataSetLa classe DataSet

ConstraintsConstraints ConstraintConstraint

ColumnsColumns ColumnColumn

DataSetDataSet

TablesTables TableTable

Oggetto

Collezione

RelationsRelations RelationRelation

RowsRows RowRow

Page 14: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Popolare un DataSetPopolare un DataSetPopolare un DataSetPopolare un DataSet

• Popolare un DataSet accedendo ad un RDBMSPopolare un DataSet accedendo ad un RDBMS

• Creare un DataSet in via programmaticaCreare un DataSet in via programmatica

• Popolare un DataSet accedendo ad un RDBMSPopolare un DataSet accedendo ad un RDBMS

• Creare un DataSet in via programmaticaCreare un DataSet in via programmatica

Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)

 Dim datPubs As DataSet = New DataSet( )adaptSQL.Fill(datPubs, "NewTable")

Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)

 Dim datPubs As DataSet = New DataSet( )adaptSQL.Fill(datPubs, "NewTable")

Dim datPubs As New DataSet( )Dim tblAuthors As DataTable = New DataTable("authors")tblAuthors.Columns.Add("AuthorID", System.Type.GetType _ ("System.Int32"))

Dim datPubs As New DataSet( )Dim tblAuthors As DataTable = New DataTable("authors")tblAuthors.Columns.Add("AuthorID", System.Type.GetType _ ("System.Int32"))

Page 15: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

La classe DataAdapterLa classe DataAdapterLa classe DataAdapterLa classe DataAdapter• E’ il collegamento tra il “mondo” connesso e E’ il collegamento tra il “mondo” connesso e

quello disconnessoquello disconnesso• Può “riempire” un dataSet avvalendosi di una Può “riempire” un dataSet avvalendosi di una

connessione connessione chiusachiusa

• E’ il collegamento tra il “mondo” connesso e E’ il collegamento tra il “mondo” connesso e quello disconnessoquello disconnesso

• Può “riempire” un dataSet avvalendosi di una Può “riempire” un dataSet avvalendosi di una connessione connessione chiusachiusa

Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)

 Dim datPubs As New DataSet( )adaptSQL.Fill(datPubs, "miaTabella")

' Accesso ai dati

adaptSQL.Update (datPubs, "miaTabella")

Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)

 Dim datPubs As New DataSet( )adaptSQL.Fill(datPubs, "miaTabella")

' Accesso ai dati

adaptSQL.Update (datPubs, "miaTabella")

Page 16: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

DataSet multi TabellaDataSet multi TabellaDataSet multi TabellaDataSet multi Tabella• Creare la prima tabellaCreare la prima tabella

• Creare le tabelle successiveCreare le tabelle successive

• Creare la prima tabellaCreare la prima tabella

• Creare le tabelle successiveCreare le tabelle successive

Dim mySqlDataAdapter As New SqlDataAdapter( "select * from customers", mySqlConnection) Dim myDataSet As New DataSet() mySqlDataAdapter.Fill(myDataSet, "Customers")

Dim mySqlDataAdapter As New SqlDataAdapter( "select * from customers", mySqlConnection) Dim myDataSet As New DataSet() mySqlDataAdapter.Fill(myDataSet, "Customers")

mySqlDataAdapter.SelectCommand.CommandText = "select * from orders"mySqlDataAdapter.Fill(myDataSet,"Orders")

mySqlDataAdapter.SelectCommand.CommandText = "select * from orders"mySqlDataAdapter.Fill(myDataSet,"Orders")

Orders

CustomersDataSet:

Data Tables

Page 17: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

La classe DataTableLa classe DataTableLa classe DataTableLa classe DataTable

Ogni elemento della proprietà Ogni elemento della proprietà TablesTables è una è una istanza della classe istanza della classe DataTableDataTable

La classe La classe DataTableDataTable espone le proprietà: espone le proprietà:– Columns: è una collezione di istanze di Columns: è una collezione di istanze di

DataColumnDataColumn– Rows: è una collezione di istanze della classe Rows: è una collezione di istanze della classe

DataRowDataRow– Una istanza della classe DataRow:Una istanza della classe DataRow:

• Mette a disposizione il contenuto delle proprie Mette a disposizione il contenuto delle proprie colonne mediante la proprietà colonne mediante la proprietà ItemItem

Ogni elemento della proprietà Ogni elemento della proprietà TablesTables è una è una istanza della classe istanza della classe DataTableDataTable

La classe La classe DataTableDataTable espone le proprietà: espone le proprietà:– Columns: è una collezione di istanze di Columns: è una collezione di istanze di

DataColumnDataColumn– Rows: è una collezione di istanze della classe Rows: è una collezione di istanze della classe

DataRowDataRow– Una istanza della classe DataRow:Una istanza della classe DataRow:

• Mette a disposizione il contenuto delle proprie Mette a disposizione il contenuto delle proprie colonne mediante la proprietà colonne mediante la proprietà ItemItem

Page 18: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Usare una DataTable: un Usare una DataTable: un esempioesempio

Usare una DataTable: un Usare una DataTable: un esempioesempio

Dim numeroRighe As Int32 = unaTabella.Rows.CountDim indiceRiga As Int32Dim unaRiga As DataRow

For indiceRiga = 0 To numeroRighe - 1unaRiga = unaTabella.Rows(indiceRiga)Dim nomeAutore As String = _

unaRiga.Item("au_fname").ToString()Next

Dim numeroRighe As Int32 = unaTabella.Rows.CountDim indiceRiga As Int32Dim unaRiga As DataRow

For indiceRiga = 0 To numeroRighe - 1unaRiga = unaTabella.Rows(indiceRiga)Dim nomeAutore As String = _

unaRiga.Item("au_fname").ToString()Next

Page 19: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

DataSetDataSetDataSetDataSet

Page 20: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

DataSet: le RelazioniDataSet: le RelazioniDataSet: le RelazioniDataSet: le Relazioni

• La classe DataSet espone la proprietà La classe DataSet espone la proprietà Relations, che è una collezione di istanze Relations, che è una collezione di istanze della classe DataRelationdella classe DataRelation

• Un oggetto DataRelation:Un oggetto DataRelation:– Definisce una associazione tra le colonne di Definisce una associazione tra le colonne di

differenti DataTabledifferenti DataTable– definisce una associazione orientata alla definisce una associazione orientata alla

navigazione sui datinavigazione sui dati– NON costituisce una constraintNON costituisce una constraint

• La classe DataSet espone la proprietà La classe DataSet espone la proprietà Relations, che è una collezione di istanze Relations, che è una collezione di istanze della classe DataRelationdella classe DataRelation

• Un oggetto DataRelation:Un oggetto DataRelation:– Definisce una associazione tra le colonne di Definisce una associazione tra le colonne di

differenti DataTabledifferenti DataTable– definisce una associazione orientata alla definisce una associazione orientata alla

navigazione sui datinavigazione sui dati– NON costituisce una constraintNON costituisce una constraint

Page 21: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Usare le Relazioni con i Usare le Relazioni con i DataSetDataSet

Usare le Relazioni con i Usare le Relazioni con i DataSetDataSet

• Creare relazioniCreare relazioni

• Accedere ai dati associatiAccedere ai dati associati

• Creare relazioniCreare relazioni

• Accedere ai dati associatiAccedere ai dati associati

Dim relPubsTitle As New DataRelation("PubsTitles", _datPubs.Tables("Publishers").Columns("pub_id"), _datPubs.Tables("Titles").Columns("pub_id"))

datPubs.Relations.Add(relPubsTitle)

Dim relPubsTitle As New DataRelation("PubsTitles", _datPubs.Tables("Publishers").Columns("pub_id"), _datPubs.Tables("Titles").Columns("pub_id"))

datPubs.Relations.Add(relPubsTitle)

Dim PubRow, TitleRow As DataRow, TitleRows( ) As DataRow

PubRow = datPubs.Tables("Publishers").Rows(0)TitleRows = PubRow.GetChildRows("PubsTitles")

Dim PubRow, TitleRow As DataRow, TitleRows( ) As DataRow

PubRow = datPubs.Tables("Publishers").Rows(0)TitleRows = PubRow.GetChildRows("PubsTitles")

Page 22: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Usare ConstraintUsare ConstraintUsare ConstraintUsare ConstraintIl supporto alle constraint della classe DataSet Il supporto alle constraint della classe DataSet

permette di:permette di:– Creare constraintCreare constraint

• Classe ForeignKeyConstraintsClasse ForeignKeyConstraints• Classe UniqueConstraintsClasse UniqueConstraints

– Usare le constraint esistenti nel DBUsare le constraint esistenti nel DB

Il supporto alle constraint della classe DataSet Il supporto alle constraint della classe DataSet permette di:permette di:– Creare constraintCreare constraint

• Classe ForeignKeyConstraintsClasse ForeignKeyConstraints• Classe UniqueConstraintsClasse UniqueConstraints

– Usare le constraint esistenti nel DBUsare le constraint esistenti nel DB

adaptSQL = New SqlClient.SqlDataAdapter("Select title_id" _& ", title, type, price from titles", conSQL)

adaptSQL.FillSchema(datPubs, schematype.Source, "Titles")adaptSQL.Fill(datPubs, "Titles")'Operazioni sui datiadaptSQL.Fill(datPubs, "Titles")

adaptSQL = New SqlClient.SqlDataAdapter("Select title_id" _& ", title, type, price from titles", conSQL)

adaptSQL.FillSchema(datPubs, schematype.Source, "Titles")adaptSQL.Fill(datPubs, "Titles")'Operazioni sui datiadaptSQL.Fill(datPubs, "Titles")

Page 23: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Integrità ReferenzialeIntegrità ReferenzialeIntegrità ReferenzialeIntegrità Referenziale

Una constraint ForeignKeyConstraint:Una constraint ForeignKeyConstraint:– permette l’integrità referenzialepermette l’integrità referenziale

• Se la proprietà EnforceConstraints del DataSet è impostata Se la proprietà EnforceConstraints del DataSet è impostata a Truea True

– Determina le azioni effettuate nelle tabelle correlateDetermina le azioni effettuate nelle tabelle correlate• Proprietà DeleteRule e UpdateRuleProprietà DeleteRule e UpdateRule

Una constraint ForeignKeyConstraint:Una constraint ForeignKeyConstraint:– permette l’integrità referenzialepermette l’integrità referenziale

• Se la proprietà EnforceConstraints del DataSet è impostata Se la proprietà EnforceConstraints del DataSet è impostata a Truea True

– Determina le azioni effettuate nelle tabelle correlateDetermina le azioni effettuate nelle tabelle correlate• Proprietà DeleteRule e UpdateRuleProprietà DeleteRule e UpdateRule

AzioneAzioneAzioneAzione DescrizioneDescrizioneDescrizioneDescrizione

CascadeCascade Cancella o aggiorna le righe correlate. E’ il default.Cancella o aggiorna le righe correlate. E’ il default.

SetNullSetNull Imposta a DBNull il valore delle righe correlate.Imposta a DBNull il valore delle righe correlate.

SetDefaultSetDefault Imposta al DefaultValue il valore delle righe correlate.Imposta al DefaultValue il valore delle righe correlate.

NoneNone Nessuna azione/modifica, viene sollevata una eccezione.Nessuna azione/modifica, viene sollevata una eccezione.

Page 24: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

DataRelationDataRelationDataRelationDataRelation

Page 25: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Modificare i DatiModificare i DatiModificare i DatiModificare i Dati

• Aggiungere righeAggiungere righe

• Modificare righeModificare righe

• Cancellare righeCancellare righe

• Aggiungere righeAggiungere righe

• Modificare righeModificare righe

• Cancellare righeCancellare righe

Dim drNewRow As DataRow = datPubs.Tables("Titles").NewRow 'Populate columnsdatPubs.Tables("Titles").Rows.Add(drNewRow)

Dim drNewRow As DataRow = datPubs.Tables("Titles").NewRow 'Populate columnsdatPubs.Tables("Titles").Rows.Add(drNewRow)

drChangeRow.BeginEdit( )drChangeRow("Title") = drChangeRow("Title").ToString & " 1"drChangeRow.EndEdit( )

drChangeRow.BeginEdit( )drChangeRow("Title") = drChangeRow("Title").ToString & " 1"drChangeRow.EndEdit( )

datPubs.Tables("Titles").Rows.Remove(drDelRow)datPubs.Tables("Titles").Rows.Remove(drDelRow)

Page 26: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

Aggiornare il databaseAggiornare il databaseAggiornare il databaseAggiornare il database• Possiamo ripercuotere le modifiche effettuate al DataSet Possiamo ripercuotere le modifiche effettuate al DataSet

sul DB:sul DB:– Esplicitando il comando di aggiornamentoEsplicitando il comando di aggiornamento

• Generando automaticamente il comando di updateGenerando automaticamente il comando di update

• Possiamo ripercuotere le modifiche effettuate al DataSet Possiamo ripercuotere le modifiche effettuate al DataSet sul DB:sul DB:– Esplicitando il comando di aggiornamentoEsplicitando il comando di aggiornamento

• Generando automaticamente il comando di updateGenerando automaticamente il comando di update

Dim comm As New SqlClient.SqlCommand("Insert titles" & _"(title_id, title, type) values(@t_id,@title,@type)")comm.Parameters.Add("@t_id",SqlDbType.VarChar,6,"title_id")comm.Parameters.Add("@title",SqlDbType.VarChar,80,"title")comm.Parameters.Add("@type",SqlDbType.Char,12,"type")adaptSQL.InsertCommand = commadaptSQL.Update(datPubs, "titles")

Dim comm As New SqlClient.SqlCommand("Insert titles" & _"(title_id, title, type) values(@t_id,@title,@type)")comm.Parameters.Add("@t_id",SqlDbType.VarChar,6,"title_id")comm.Parameters.Add("@title",SqlDbType.VarChar,80,"title")comm.Parameters.Add("@type",SqlDbType.Char,12,"type")adaptSQL.InsertCommand = commadaptSQL.Update(datPubs, "titles")

Dim sqlCommBuild As New SqlCommandBuilder(adaptSQL)MsgBox(sqlCommBuild.GetInsertCommand.CommandText)adaptSQL.Update(datPubs, "titles")

Dim sqlCommBuild As New SqlCommandBuilder(adaptSQL)MsgBox(sqlCommBuild.GetInsertCommand.CommandText)adaptSQL.Update(datPubs, "titles")

Page 27: ADO.NET Primer Andrea Saltarello Software Architect – Software Architect – Managed Designs S.r.l.Managed Designs S.r.l

LinksLinksLinksLinks

http://www.ugidotnet.org

http://forum.ugidotnet.org

http://mobile.ugidotnet.org