1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform...
-
Upload
cody-mckenna -
Category
Documents
-
view
217 -
download
0
Transcript of 1 / 31 ADO.NET, l'utilizzo pratico nelle applicazioni Silvano Coriani Developer & Platform...
1 / 31
ADO.NET, l'utilizzo pratico nelle applicazioni
Silvano CorianiDeveloper & Platform Evangelism
MCTrainerMCSDeveloperMCADeveloperMCSEInternetMCDBA
2 / 31
Da dove iniziare...
3 / 31
AgendaAgenda
4 / 31
Popolare il DataSetPopolare il DataSet• MissingSchemaActionMissingSchemaAction
5 / 31
Popolare il DataSetPopolare il DataSet• unicounaunicotutteunicounaunicotutte
6 / 31
Popolare il DataSetPopolare il DataSet
7 / 31
Popolare il DataSetPopolare il DataSet• ExecuteXmlReader()ExecuteXmlReader()
8 / 31
Popolare il DataSetPopolare il DataSet
9 / 31
Popolare il DataSetPopolare il DataSet
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();
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
12 / 31
Come funziona il metodo Update?
DB
Select
Insert
Update
Delete
CustomerDataTable
Customers
13 / 31
Creazione manuale dei comandi del DataAdapter
• RowVersion
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));
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));
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()
17 / 31
Aggiornamenti sulla DataTable
• Current• HasVersion()RowUpdated
18 / 31
Aggiornamenti sulla DataTable
• RowState– RowErrorHasErrorstrue
19 / 31
Aggiornamenti sulla DataTable
• Select()DataRows– DataViewRowState
20 / 31
Merge di DataSet
• stato
21 / 31
Gestione dei conflitti
22 / 31
Gestione della concorrenza con ADO.NET
• Timestamp
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
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();
25 / 31
Concorrenza ottimistica in SQL Server
• ts_equal()
26 / 31
Concorrenza ottimistica in ADO.NET
• Update()DBConcurrencyExceptionContinueUpdateOnErrorHasError
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
}
}
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
29 / 31
Aggiornamento di dati gerarchici
• Select()DataRowState.AddedDataRowState.Deleted
30 / 31
Lavorare con i campi di tipo IDENTITY
• AutoIncrementSeedAutoIncrementStepDataTableSelect()DataRowUpdate()
31 / 31
Link utili
32 / 31
News
33 / 31