1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform...

33
1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet MCDBA

Transcript of 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform...

Page 1: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet.

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.

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.

3 / 31

AgendaAgenda

Page 4: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

31 / 31

Link utili

Page 32: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet.

32 / 31

News

Page 33: 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet.

33 / 31