![Page 1: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/1.jpg)
1 / 31
ADO.NET, l'utilizzo pratico nelle applicazioni
Silvano CorianiDeveloper & Platform Evangelism
MCTrainerMCSDeveloperMCADeveloperMCSEInternetMCDBA
![Page 2: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/2.jpg)
2 / 31
Da dove iniziare...
![Page 3: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/3.jpg)
3 / 31
AgendaAgenda
![Page 4: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/4.jpg)
4 / 31
Popolare il DataSetPopolare il DataSet• MissingSchemaActionMissingSchemaAction
![Page 5: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/5.jpg)
5 / 31
Popolare il DataSetPopolare il DataSet• unicounaunicotutteunicounaunicotutte
![Page 6: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/6.jpg)
6 / 31
Popolare il DataSetPopolare il DataSet
![Page 7: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/7.jpg)
7 / 31
Popolare il DataSetPopolare il DataSet• ExecuteXmlReader()ExecuteXmlReader()
![Page 8: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/8.jpg)
8 / 31
Popolare il DataSetPopolare il DataSet
![Page 9: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/9.jpg)
9 / 31
Popolare il DataSetPopolare il DataSet
![Page 10: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/10.jpg)
10 / 31
Semplici aggiornamenti in ADO.NET
• DataAdapter
[C#]
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers",nwindConn);
SqlCommandBuilder custCB = new SqlCommandBuilder(custDA);
nwindConn.Open();
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
// Modifico il dataset
// Senza il SqlCommandBuilder l’Update fallirebbe
custDA.Update(custDS, "Customers");
nwindConn.Close();
[C#]
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers",nwindConn);
SqlCommandBuilder custCB = new SqlCommandBuilder(custDA);
nwindConn.Open();
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
// Modifico il dataset
// Senza il SqlCommandBuilder l’Update fallirebbe
custDA.Update(custDS, "Customers");
nwindConn.Close();
![Page 11: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/11.jpg)
11 / 31
Semplici aggiornamenti in ADO.NET
• valori originaliCommandBuilder li ricava dal comando di Select
• Noi conosciamo la logica di aggiornamento dei dati meglio del CommandBuilder
• Costruiamoli da codice o facciamoli costruire da VS.NET
![Page 12: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/12.jpg)
12 / 31
Come funziona il metodo Update?
DB
Select
Insert
Update
Delete
CustomerDataTable
Customers
![Page 13: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/13.jpg)
13 / 31
Creazione manuale dei comandi del DataAdapter
• RowVersion
![Page 14: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/14.jpg)
14 / 31
Comando di Update del DataAdapter
string strSQL = "SELECT CustomerID, CompanyName FROM Customers“;SqlConnection cnn = new SqlConnection(“Server=(local);...“);SqlDataAdapter = new SqlDataAdapter(str,cnn);
string strSQLUpd = "UPDATE Customers SET CustomerID = ?, CompanyName = ? WHERE CustomerID = ? AND CompanyName = ?“;da.UpdateCommand = new SqlCommand(strSQLUpd, cnn)
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCustomerID", SqlDbType.WChar, 5,ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCustomerID", SqlDbType.WChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Original, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Original, null));
string strSQL = "SELECT CustomerID, CompanyName FROM Customers“;SqlConnection cnn = new SqlConnection(“Server=(local);...“);SqlDataAdapter = new SqlDataAdapter(str,cnn);
string strSQLUpd = "UPDATE Customers SET CustomerID = ?, CompanyName = ? WHERE CustomerID = ? AND CompanyName = ?“;da.UpdateCommand = new SqlCommand(strSQLUpd, cnn)
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCustomerID", SqlDbType.WChar, 5,ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCustomerID", SqlDbType.WChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Original, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Original, null));
![Page 15: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/15.jpg)
15 / 31
[SQL Code]CREATE PROCEDURE UpdateCustomer (@NewCustomerID nchar(5), @NewCompanyName nvarchar(40), @OldCustomerID nchar(5), @OldCompanyName nvarchar(40))AS UPDATE Customers SET CustomerID = @NewCustomerID, CompanyName = @NewCompanyName WHERE CustomerID = @OldCustomerID AND CompanyName = @OldCompanyName
[ADO.NET Code]da.UpdateCommand.CommandText = "UpdateCustomer“;da.UpdateCommand.CommandType = CommandType.StoredProcedure;
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCustomerID", SqlDbType.WChar, 5,ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCustomerID", SqlDbType.WChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Original, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Original, null));
[SQL Code]CREATE PROCEDURE UpdateCustomer (@NewCustomerID nchar(5), @NewCompanyName nvarchar(40), @OldCustomerID nchar(5), @OldCompanyName nvarchar(40))AS UPDATE Customers SET CustomerID = @NewCustomerID, CompanyName = @NewCompanyName WHERE CustomerID = @OldCustomerID AND CompanyName = @OldCompanyName
[ADO.NET Code]da.UpdateCommand.CommandText = "UpdateCustomer“;da.UpdateCommand.CommandType = CommandType.StoredProcedure;
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCustomerID", SqlDbType.WChar, 5,ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("NewCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Current, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCustomerID", SqlDbType.WChar, 5, ParameterDirection.Input, false, 0, 0, "CustomerID", DataRowVersion.Original, null));
da.UpdateCommand.Parameters.Add(new SqlParameter("OldCompanyName", SqlDbType.VarWChar, 40, ParameterDirection.Input, false, 0, 0, "CompanyName", DataRowVersion.Original, null));
![Page 16: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/16.jpg)
16 / 31
Aggiornamenti sull’oggetto DataTable
• Per inserire un record sull’oggetto DataTable– AddRow()Detached– Rows.Add(DataRow)Added– AcceptChanges() esegue la commit di tutte le
modifiche nella cache locale. Riporta a UnChanged le righe inserite e modificate. Rimuove le eliminate.
– RejectChanges()
![Page 17: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/17.jpg)
17 / 31
Aggiornamenti sulla DataTable
• Current• HasVersion()RowUpdated
![Page 18: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/18.jpg)
18 / 31
Aggiornamenti sulla DataTable
• RowState– RowErrorHasErrorstrue
![Page 19: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/19.jpg)
19 / 31
Aggiornamenti sulla DataTable
• Select()DataRows– DataViewRowState
![Page 20: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/20.jpg)
20 / 31
Merge di DataSet
• stato
![Page 21: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/21.jpg)
21 / 31
Gestione dei conflitti
![Page 22: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/22.jpg)
22 / 31
Gestione della concorrenza con ADO.NET
• Timestamp
![Page 23: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/23.jpg)
23 / 31
Transazioni in ADO.NET
• Transazioni distribuite– Utilizzando gli EnterpriseServices di .NET o COM+– La connessione al singolo DB viene arruolata dal
MS DTC all’interno del contesto di una transazione– Utilizza two-phase commit su Ole Transaction o XA
per i vari Resource Manager– Da usare solo quando veramente necessario
• Transazioni locali– All’interno del codice SQL delle Stored Procedure
• BEGIN/COMMIT TRAN– SqlTransaction
![Page 24: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/24.jpg)
24 / 31
Transazioni in ADO.NET
[C#]
SqlConnection conn = new SqlConnection();
conn.Open("...");
SqlTransaction tx = conn.BeginTransaction();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "...";
cmd.Transaction = tx;
cmd.ExecuteNonQuery();
tx.Commit();
![Page 25: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/25.jpg)
25 / 31
Concorrenza ottimistica in SQL Server
• ts_equal()
![Page 26: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/26.jpg)
26 / 31
Concorrenza ottimistica in ADO.NET
• Update()DBConcurrencyExceptionContinueUpdateOnErrorHasError
![Page 27: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/27.jpg)
27 / 31
Concorrenza ottimistica in ADO.NET
• RowUpdated
[C#]
daMain.RowUpdated += new SqllRowUpdatedEventHandler(HandleRowUpdated);
…
private void HandleRowUpdated(object sender, SqlRowUpdatedEventArgs e) {
if ((e.Status == UpdateStatus.ErrorsOccurred) &&
(e.Errors.GetType == typeof(DBConcurrencyException)) {
daConflict.SelectCommand.Parameters[0].Value = e.Row["ID"];
int intRowsReturned = ConflictAdapter.Fill(ConflictDataSet);
if (intRowsReturned == 1)
e.Row.RowError =“The row has been modified by another user."; else
e.Row.RowError = "The row no longer exists in the database.";
e.Status = UpdateStatus.Continue;// determina se proseguire o no
}
}
![Page 28: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/28.jpg)
28 / 31
Re-fetching di una riga dopo l’update
• UpdateRowSource
INSERT INTO Orders (CustomerID, EmployeeID, OrderDate) VALUES (?, ?, GetDate());SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders WHERE OrderID = @@IDENTITY
INSERT INTO Orders (CustomerID, EmployeeID, OrderDate) VALUES (?, ?, GetDate());SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders WHERE OrderID = @@IDENTITY
![Page 29: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/29.jpg)
29 / 31
Aggiornamento di dati gerarchici
• Select()DataRowState.AddedDataRowState.Deleted
![Page 30: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/30.jpg)
30 / 31
Lavorare con i campi di tipo IDENTITY
• AutoIncrementSeedAutoIncrementStepDataTableSelect()DataRowUpdate()
![Page 31: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/31.jpg)
31 / 31
Link utili
![Page 32: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/32.jpg)
32 / 31
News
![Page 33: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet](https://reader035.vdocument.in/reader035/viewer/2022062618/5513ed875503463a298b5e61/html5/thumbnails/33.jpg)
33 / 31