Aggiornamento del database DB2 con un adattatore dati e il set di dati
Il Update
metodo di viene chiamato per risolvere le modifiche da un set di MsDb2DataAdapter
dati all'origine dati. Il Update
metodo, ad esempio il metodo, accetta come argomenti un'istanza Fill
di DataSet
e un oggetto o DataTable
un nome facoltativoDataTable
. L'istanza DataSet
è l'oggetto DataSet
contenente le modifiche apportate e l'oggetto DataTable
identifica la tabella da cui recuperare le modifiche.
Chiamata al metodo Update
Quando si chiama il Update
metodo, MsDb2DataAdapter
analizza le modifiche apportate ed esegue il comando appropriato (INSERT, UPDATE o DELETE). Quando si MsDb2DataAdapter
verifica una modifica a una riga di dati, usa InsertCommand
, UpdateCommand
o DeleteCommand
per elaborare la modifica. Ciò consente di ottimizzare le prestazioni dell'applicazione ADO.NET specificando la sintassi dei comandi in fase di progettazione e, se possibile, con stored procedure. È necessario impostare in modo esplicito i comandi prima di chiamare Update
. Se Update
viene chiamato e il comando appropriato non esiste per un particolare aggiornamento (ad esempio, nessuna DeleteCommand
riga eliminata), viene generata un'eccezione. È possibile usare i parametri di comando per specificare i valori di input e di output per un'istruzione SQL o una stored procedure per ogni riga modificata in un set di dati.
Se l'oggetto DataTable
esegue il mapping a o viene generato da una singola tabella di database, è possibile sfruttare l'oggetto per generare automaticamente le InsertCommand
DeleteCommand
proprietà , e UpdateCommand
dell'oggetto MsDb2CommandBuilder
MsDb2DataAdapter
.
Aggiornamento dei set di dati
Il Update
metodo risolve le modifiche apportate all'origine dati. Tuttavia, altri client potrebbero aver modificato i dati nell'origine dati dall'ultima volta che è stato compilato il set di dati. Per aggiornare il set di dati con i dati correnti, usare il MsDb2DataAdapter
metodo e Fill
. Le nuove righe vengono aggiunte alla tabella e le informazioni aggiornate vengono incorporate in righe esistenti. Il Fill
metodo determina se verrà aggiunta una nuova riga o una riga esistente verrà aggiornata esaminando i valori principali delle righe nel set di dati e le righe restituite da SelectCommand
. Se il Fill
metodo rileva un valore chiave primaria per una riga nel set di dati che corrisponde a un valore di chiave primaria da una riga nei risultati restituiti da SelectCommand
, aggiorna la riga esistente con le informazioni della riga restituita dalla SelectCommand
riga e imposta la RowState
proprietà della riga esistente su Unchanged
. Se una riga restituita da SelectCommand
ha un valore di chiave primaria che non corrisponde a uno dei valori chiave primaria delle righe del set di dati, il Fill
metodo aggiunge una nuova riga con un RowState
oggetto .Unchanged
Nota
Se SelectCommand
restituisce i risultati di un OUTER JOIN, l'oggetto DataAdapter
non imposta un valore PrimaryKey per l'oggetto risultante DataTable
. È necessario definire l'elemento PrimaryKey autonomamente per assicurarsi che le righe duplicate vengano risolte correttamente.
Per gestire le eccezioni che potrebbero verificarsi quando si chiama il metodo, è possibile usare l'evento Update
RowUpdated
per rispondere agli errori di aggiornamento delle righe durante la loro esecuzione oppure è possibile impostare DataAdapter.ContinueUpdateOnError
su true
prima di chiamare Update
e rispondere alle informazioni sull'errore archiviate nella RowError
proprietà di una determinata riga al termine dell'aggiornamento.
Nota
La chiamata AcceptChanges
agli DataSet
oggetti , DataTable
o DataRow
causa la sovrascrivere tutti i valori originali per una riga di dati con i valori Correnti per la riga di dati. Se i valori del campo che identificano la riga come univoci sono stati modificati, dopo aver chiamato AcceptChanges
, i valori originali non corrispondono più ai valori nell'origine dati.
Uso delle colonne di incremento automatico
Se le tabelle dell'origine dati hanno colonne di incremento automatico, è possibile riempire le colonne nel set di dati restituendo il valore di incremento automatico come parametro di output di una stored procedure e mapping a una colonna in una tabella oppure usando l'evento RowUpdated
di MsDb2DataAdapter
.
Tuttavia, i valori nel set di dati possono diventare non sincronizzati con i valori all'origine dati e comportano un comportamento imprevisto. Si consideri ad esempio una tabella con una colonna chiave primaria di incremento automatico di CustomerID. Se si aggiungono due nuovi clienti all'interno del set di dati, ricevono valori CustomerId incrementati automaticamente di 1 e 2. Quando la seconda riga del cliente viene passata al metodo di MsDb2DataAdapter
, la riga appena aggiunta riceve un valore CustomerID incrementato automaticamente pari a Update
1 all'origine dati, che non corrisponde al valore, 2, nel set di dati. Quando la MsDb2DataAdapter
riga viene riempita nel set di dati con il valore restituito, si verifica una violazione del vincolo perché la prima riga del cliente ha già un CustomerID pari a 1.
Per evitare questo comportamento, è consigliabile creare la colonna nel set di dati con un aumento automatico delle colonne in un'origine dati e aumentare automaticamente le colonne in un set di dati, creare la colonna nel set di dati con un'istruzione AutoIncrementStep di -1 e autoIncrementSeed di 0 e assicurarsi che l'origine dati generi valori di Identità con incremento automatico a partire da 1 e incrementando con un valore di passaggio positivo. Di conseguenza, il set di dati genererà numeri negativi per i valori incrementati automaticamente che non sono in conflitto con i valori di incremento automatico positivi generati dall'origine dati. Un'altra opzione consiste nell'usare colonne di tipo Guid
anziché incrementare automaticamente le colonne. L'algoritmo che genera Guid
valori non deve mai generare lo stesso Guid
nel set di dati generato dall'origine dati.
In molte circostanze, l'ordine in cui le modifiche apportate tramite il set di dati vengono inviate all'origine dati è importante. Ad esempio, se viene aggiornato un valore di chiave primaria per una riga esistente e una nuova riga è stata aggiunta con il nuovo valore della chiave primaria, è importante elaborare l'aggiornamento prima dell'inserimento.
È possibile usare il Select
metodo dell'oggetto DataTable
per restituire una DataRow
matrice che fa riferimento solo alle righe con un determinato RowState
oggetto . È quindi possibile passare la matrice DataRow
restituita al metodo Update
di MsDb2DataAdapter
per elaborare le righe modificate. Se si specifica un subset di righe da aggiornare, è possibile controllare l'ordine in cui vengono elaborati gli inserimenti, gli aggiornamenti e le eliminazioni.