Share via


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 DataSete 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, UpdateCommando 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 InsertCommandDeleteCommandproprietà , e UpdateCommand dell'oggetto MsDb2CommandBuilderMsDb2DataAdapter .

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 UpdateRowUpdated per rispondere agli errori di aggiornamento delle righe durante la loro esecuzione oppure è possibile impostare DataAdapter.ContinueUpdateOnError su true prima di chiamare Updatee rispondere alle informazioni sull'errore archiviate nella RowError proprietà di una determinata riga al termine dell'aggiornamento.

Nota

La chiamata AcceptChanges agli DataSetoggetti , DataTableo 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 RowStateoggetto . È 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.

Vedere anche

Uso di adattatori e set di dati per un database DB2