Modificare i dati nei set di dati usando .NET Framework

Nota

I set di dati e le classi correlate sono tecnologie .NET Framework legacy dei primi anni '2000 che consentono alle applicazioni di lavorare con i dati in memoria mentre le applicazioni vengono disconnesse dal database. Sono particolarmente utili per le applicazioni che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Anche se i set di dati hanno dimostrato di essere una tecnologia molto efficace, è consigliabile che le nuove applicazioni .NET usino Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e ha un'interfaccia di programmazione più semplice.

È possibile modificare i dati nelle tabelle dati in modo analogo a quelli di una tabella in qualsiasi database. Il processo può includere inserimento, aggiornamento ed eliminazione di record nella tabella. In un modulo associato a dati è possibile specificare i campi modificabili dall'utente. In questi casi, l'infrastruttura di associazione dati gestisce tutto il rilevamento delle modifiche in modo che le modifiche possano essere inviate al database in un secondo momento. Se si apportano modifiche ai dati a livello di codice e si prevede di inviare tali modifiche al database, è necessario utilizzare gli oggetti e i metodi che eseguono automaticamente il rilevamento delle modifiche.

Oltre a modificare i dati effettivi, è anche possibile eseguire una query su per DataTable restituire righe di dati specifiche. Ad esempio, è possibile eseguire una query per singole righe, versioni specifiche di righe (originali e proposte), righe modificate o righe con errori.

Per modificare le righe in un set di dati

Per modificare una riga esistente in un DataTableoggetto , è necessario individuare l'oggetto DataRow da modificare e quindi assegnare i valori aggiornati alle colonne desiderate.

Se non si conosce l'indice della riga da modificare, usare il FindBy metodo per eseguire la ricerca in base alla chiave primaria:

NorthwindDataSet.CustomersRow customersRow = 
    northwindDataSet1.Customers.FindByCustomerID("ALFKI");

customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";

Se si conosce l'indice di riga, è possibile accedere e modificare le righe come indicato di seguito:

northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";

Per inserire nuove righe in un set di dati

Le applicazioni che usano controlli associati a dati in genere aggiungono nuovi record tramite il pulsante Aggiungi nuovo in un controllo BindingNavigator.

Per aggiungere manualmente nuovi record a un set di dati, creare una nuova riga di dati chiamando il metodo in DataTable. Aggiungere quindi la riga alla DataRow raccolta (Rows) di DataTable:

NorthwindDataSet.CustomersRow newCustomersRow = 
    northwindDataSet1.Customers.NewCustomersRow();

newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";

northwindDataSet1.Customers.Rows.Add(newCustomersRow);

Per conservare le informazioni necessarie al set di dati per inviare aggiornamenti all'origine dati, usare il Delete metodo per rimuovere le righe in una tabella dati. Ad esempio, se l'applicazione usa un oggetto TableAdapter (o DataAdapter), il metodo tableAdapter Update elimina le righe nel database con un RowState oggetto .Deleted

Se l'applicazione non deve inviare gli aggiornamenti a un'origine dati, è possibile rimuovere i record accedendo direttamente alla raccolta di righe di dati (Remove).

Per eliminare record da una tabella dati

  • Chiamare il Delete metodo di un oggetto DataRow.

    Questo metodo non rimuove fisicamente il record. Contrassegna invece il record per l'eliminazione.

    Nota

    Se si ottiene la proprietà count di un DataRowCollectionoggetto , il conteggio risultante include record contrassegnati per l'eliminazione. Per ottenere un conteggio accurato dei record che non sono contrassegnati per l'eliminazione, è possibile scorrere la raccolta esaminando la RowState proprietà di ogni record. I record contrassegnati per l'eliminazione hanno un RowState valore . Deleted) In alternativa, è possibile creare una visualizzazione dati di un set di dati che filtra in base allo stato di riga e ottenere la proprietà count da questa posizione.

Nell'esempio seguente viene illustrato come chiamare il Delete metodo per contrassegnare la prima riga della Customers tabella come eliminata:

northwindDataSet1.Customers.Rows[0].Delete();

Determinare se sono presenti righe modificate

Quando vengono apportate modifiche ai record in un set di dati, le informazioni su tali modifiche vengono archiviate fino a quando non vengono eseguite il commit. Si esegue il commit delle modifiche quando si chiama il AcceptChanges metodo di un set di dati o di una tabella di dati o quando si chiama il Update metodo di un oggetto TableAdapter o di un adattatore dati.

Le modifiche vengono rilevate in due modi in ogni riga di dati:

  • Ogni riga di dati contiene informazioni correlate al relativo RowState oggetto , ad esempio , ModifiedAdded, Deletedo Unchanged.

  • Ogni riga di dati modificata contiene più versioni di tale riga (DataRowVersion), la versione originale (prima delle modifiche) e la versione corrente (dopo le modifiche). Durante il periodo in cui una modifica è in sospeso (il momento in cui è possibile rispondere all'evento RowChanging ), è disponibile anche una terza versione, la versione proposta.

Il HasChanges metodo di un set di dati restituisce true se sono state apportate modifiche nel set di dati. Dopo aver determinato l'esistenza di righe modificate, è possibile chiamare il GetChanges metodo di un DataSet oggetto o DataTable per restituire un set di righe modificate.

Per determinare se sono state apportate modifiche a qualsiasi riga

  • Chiamare il HasChanges metodo di un set di dati per verificare la presenza di righe modificate.

Nell'esempio seguente viene illustrato come controllare il valore restituito dal HasChanges metodo per rilevare se sono presenti righe modificate in un set di dati denominato NorthwindDataset1:

if (northwindDataSet1.HasChanges()) 
{
    // Changed rows were detected, add appropriate code.
}
else
{
    // No changed rows were detected, add appropriate code.
}

Determinare il tipo di modifiche

È anche possibile verificare il tipo di modifiche apportate in un set di dati passando un valore dall'enumerazione DataRowState al HasChanges metodo .

Per determinare il tipo di modifiche apportate a una riga

Nell'esempio seguente viene illustrato come controllare un set di dati denominato NorthwindDataset1 per determinare se sono state aggiunte nuove righe:

if (northwindDataSet1.HasChanges(DataRowState.Added)) 
{
    // New rows have been added to the dataset, add appropriate code.
}
else
{
    // No new rows have been added to the dataset, add appropriate code.
}

Per individuare le righe con errori

Quando si utilizzano singole colonne e righe di dati, è possibile che si verifichino errori. È possibile controllare la HasErrors proprietà per determinare se esistono errori in un DataSetoggetto , DataTableo DataRow.

  1. Controllare la HasErrors proprietà per verificare se sono presenti errori nel set di dati.

  2. Se la HasErrors proprietà è true, scorrere le raccolte di tabelle e quindi passare attraverso le righe per trovare la riga con l'errore.

private void FindErrors() 
{
    if (dataSet1.HasErrors)
    {
        foreach (DataTable table in dataSet1.Tables)
        {
            if (table.HasErrors)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row.HasErrors)
                    {
                        // Process error here.
                    }
                }
            }
        }
    }
}