Convalidare i dati nei set di dati nelle applicazioni .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.

La convalida dei dati è il processo di confermare che i valori immessi negli oggetti dati siano conformi ai vincoli all'interno dello schema di un set di dati. Il processo di convalida conferma anche che questi valori seguono le regole stabilite per l'applicazione. È consigliabile convalidare i dati prima di inviare aggiornamenti al database sottostante. In questo modo si riducono gli errori e il numero potenziale di round trip tra un'applicazione e il database.

È possibile verificare che i dati scritti in un set di dati siano validi compilando controlli di convalida nel set di dati stesso. Il set di dati può controllare i dati indipendentemente dal modo in cui viene eseguito l'aggiornamento, indipendentemente dal fatto che vengano eseguiti direttamente dai controlli in una maschera, all'interno di un componente o in altro modo. Poiché il set di dati fa parte dell'applicazione (a differenza del back-end del database), è una posizione logica per compilare la convalida specifica dell'applicazione.

La posizione migliore per aggiungere la convalida all'applicazione è nel file di classe parziale del set di dati. In Visual Basic o Visual C# aprire Progettazione set di dati e fare doppio clic sulla colonna o sulla tabella per cui si vuole creare la convalida. Questa azione apre il file di codice, in cui è possibile creare un ColumnChanging gestore eventi o RowChanging .

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Convalida i dati

La convalida all'interno di un set di dati viene eseguita nei modi seguenti:

Diversi eventi vengono generati dall'oggetto DataTable quando si verifica una modifica in un record:

  • Gli ColumnChanging eventi e ColumnChanged vengono generati durante e dopo ogni modifica a una singola colonna. L'evento ColumnChanging è utile quando si desidera convalidare le modifiche in colonne specifiche. Le informazioni sulla modifica proposta vengono passate come argomento con l'evento .
  • Gli RowChanging eventi e RowChanged vengono generati durante e dopo qualsiasi modifica in una riga. L'evento RowChanging è più generale. Indica che si sta verificando una modifica in un punto qualsiasi della riga, ma non si sa quale colonna è stata modificata.

Per impostazione predefinita, ogni modifica a una colonna genera quindi quattro eventi. Il primo è l'evento ColumnChanging e ColumnChanged per la colonna specifica da modificare. Di seguito sono riportati gli RowChanging eventi e RowChanged . Se vengono apportate più modifiche alla riga, gli eventi verranno generati per ogni modifica.

Nota

Il metodo della riga di BeginEdit dati disattiva gli RowChanging eventi e RowChanged dopo la modifica di ogni singola colonna. In tal caso, l'evento non viene generato finché il EndEdit metodo non viene chiamato, quando gli RowChanging eventi e RowChanged vengono generati una sola volta. Per altre informazioni, vedere Disattivare i vincoli durante il riempimento di un set di dati.

L'evento scelto dipende dalla granularità della convalida. Se è importante rilevare un errore immediatamente quando viene modificata una colonna, eseguire la convalida della compilazione usando l'evento ColumnChanging . In caso contrario, usare l'evento , che potrebbe causare l'acquisizione RowChanging di diversi errori contemporaneamente. Inoltre, se i dati sono strutturati in modo che il valore di una colonna venga convalidato in base al contenuto di un'altra colonna, eseguire la convalida durante l'evento RowChanging .

Quando i record vengono aggiornati, l'oggetto DataTable genera eventi a cui è possibile rispondere man mano che si verificano modifiche e dopo che vengono apportate modifiche.

Se l'applicazione usa un set di dati tipizzato, è possibile creare gestori eventi fortemente tipizzato. In questo modo vengono aggiunti quattro eventi tipizzato aggiuntivi per i quali è possibile creare gestori: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeletinge dataTableNameRowDeleted. Questi gestori eventi tipizzato passano un argomento che include i nomi di colonna della tabella che semplificano la scrittura e la lettura del codice.

Eventi di aggiornamento dei dati

Evento Descrizione
ColumnChanging Il valore in una colonna viene modificato. L'evento passa la riga e la colonna all'utente, insieme al nuovo valore proposto.
ColumnChanged Il valore in una colonna è stato modificato. L'evento passa la riga e la colonna all'utente, insieme al valore proposto.
RowChanging Le modifiche apportate a un DataRow oggetto stanno per essere sottoposte a commit nel set di dati. Se non è stato chiamato il BeginEdit metodo , l'evento RowChanging viene generato per ogni modifica a una colonna immediatamente dopo la generazione dell'evento ColumnChanging . Se viene chiamato BeginEdit prima di apportare modifiche, l'evento RowChanging viene generato solo quando si chiama il EndEdit metodo .

L'evento passa la riga all'utente, insieme a un valore che indica il tipo di azione (modifica, inserimento e così via) da eseguire.
RowChanged Una riga è stata modificata. L'evento passa la riga all'utente, insieme a un valore che indica il tipo di azione (modifica, inserimento e così via) da eseguire.
RowDeleting Viene eliminata una riga. L'evento passa la riga all'utente, insieme a un valore che indica il tipo di azione (eliminazione).
RowDeleted Una riga è stata eliminata. L'evento passa la riga all'utente, insieme a un valore che indica il tipo di azione (eliminazione).

Gli ColumnChangingeventi , RowChanginge RowDeleting vengono generati durante il processo di aggiornamento. È possibile usare questi eventi per convalidare i dati o eseguire altri tipi di elaborazione. Poiché l'aggiornamento è in corso durante questi eventi, è possibile annullarlo generando un'eccezione che impedisce il completamento dell'aggiornamento.

Gli ColumnChangedeventi , RowChanged e RowDeleted sono eventi di notifica generati al termine dell'aggiornamento. Questi eventi sono utili quando si vuole eseguire ulteriori azioni in base a un aggiornamento riuscito.

Convalidare i dati durante le modifiche alle colonne

Nota

Progettazione set di dati crea una classe parziale in cui è possibile aggiungere la logica di convalida a un set di dati. Il set di dati generato dalla finestra di progettazione non elimina o modifica il codice nella classe parziale.

È possibile convalidare i dati quando il valore in una colonna di dati cambia rispondendo all'evento ColumnChanging . Quando viene generato, questo evento passa un argomento evento (ProposedValue) che contiene il valore proposto per la colonna corrente. In base al contenuto di e.ProposedValue, è possibile:

  • Accettare il valore proposto facendo nulla.

  • Rifiutare il valore proposto impostando l'errore di colonna (SetColumnError) all'interno del gestore eventi di modifica della colonna.

  • Facoltativamente, usare un ErrorProvider controllo per visualizzare un messaggio di errore all'utente. Per altre informazioni, vedere Componente ErrorProvider.

La convalida può essere eseguita anche durante l'evento RowChanging .

Convalidare i dati durante le modifiche alle righe

È possibile scrivere codice per verificare che ogni colonna da convalidare contenga dati che soddisfino i requisiti dell'applicazione. A tale scopo, impostare la colonna per indicare che contiene un errore se un valore proposto non è accettabile. Negli esempi seguenti viene impostato un errore di colonna quando la Quantity colonna è uguale o inferiore a 0. I gestori eventi di modifica delle righe devono essere simili agli esempi seguenti.

Per convalidare i dati quando viene modificata una riga (Visual Basic)

  1. Aprire il set di dati in Progettazione DataSet. Per altre informazioni, vedere Procedura dettagliata: Creazione di un set di dati in Progettazione set di dati.

  2. Fare doppio clic sulla barra del titolo della tabella da convalidare. Questa azione crea automaticamente il RowChanging gestore eventi di DataTable nel file di classe parziale del set di dati.

    Suggerimento

    Fare doppio clic a sinistra del nome della tabella per creare il gestore eventi di modifica delle righe. Se si fa doppio clic sul nome della tabella, è possibile modificarlo.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

Per convalidare i dati quando una riga cambia (C#)

  1. Aprire il set di dati in Progettazione DataSet. Per altre informazioni, vedere Procedura dettagliata: Creazione di un set di dati in Progettazione set di dati.

  2. Fare doppio clic sulla barra del titolo della tabella da convalidare. Questa azione crea un file di classe parziale per l'oggetto DataTable.

    Nota

    Progettazione set di dati non crea automaticamente un gestore eventi per l'evento RowChanging . È necessario creare un metodo per gestire l'evento RowChanging ed eseguire il codice per associare l'evento nel metodo di inizializzazione della tabella.

  3. Copiare il codice seguente nella classe parziale:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

Per recuperare le righe modificate

Ogni riga di una tabella dati ha una RowState proprietà che tiene traccia dello stato corrente della riga utilizzando i valori nell'enumerazione DataRowState . È possibile restituire righe modificate da un set di dati o da una tabella di dati chiamando il GetChanges metodo di un DataSet oggetto o DataTable. È possibile verificare che le modifiche esistano prima di chiamare GetChanges chiamando il HasChanges metodo di un set di dati.

Nota

Dopo aver eseguito il commit delle modifiche a un set di dati o a una tabella di dati (chiamando il AcceptChanges metodo ), il GetChanges metodo non restituisce dati. Se l'applicazione deve elaborare le righe modificate, è necessario elaborare le modifiche prima di chiamare il AcceptChanges metodo .

La chiamata al GetChanges metodo di un set di dati o di una tabella di dati restituisce un nuovo set di dati o una tabella di dati contenente solo i record modificati. Se si desidera ottenere record specifici, ad esempio solo nuovi record o solo record modificati, è possibile passare un valore dall'enumerazione DataRowState come parametro al GetChanges metodo .

Usare l'enumerazione DataRowVersion per accedere alle diverse versioni di una riga, ad esempio i valori originali presenti in una riga prima dell'elaborazione.

Per ottenere tutti i record modificati da un set di dati

  • Chiamare il GetChanges metodo di un set di dati.

    L'esempio seguente crea un nuovo set di dati denominato changedRecords e lo popola con tutti i record modificati da un altro set di dati denominato dataSet1.

    DataSet changedRecords = dataSet1.GetChanges();
    

Per ottenere tutti i record modificati da una tabella dati

  • Chiamare il GetChanges metodo di un oggetto DataTable.

    Nell'esempio seguente viene creata una nuova tabella dati denominata changedRecordsTable e popolata con tutti i record modificati da un'altra tabella di dati denominata dataTable1.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Per ottenere tutti i record con uno stato di riga specifico

  • Chiamare il GetChanges metodo di un set di dati o di una tabella di dati e passare un DataRowState valore di enumerazione come argomento.

    Nell'esempio seguente viene illustrato come creare un nuovo set di dati denominato addedRecords e popolarlo solo con record aggiunti al dataSet1 set di dati.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    Nell'esempio seguente viene illustrato come restituire tutti i record aggiunti di recente alla Customers tabella:

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

Accedere alla versione originale di un DataRow

Quando vengono apportate modifiche alle righe di dati, il set di dati mantiene le versioni originali (Original) e nuoveCurrent () della riga. Ad esempio, prima di chiamare il metodo, l'applicazione AcceptChanges può accedere alle diverse versioni di un record (come definito nell'enumerazione DataRowVersion ) ed elaborare le modifiche di conseguenza.

Nota

Esistono versioni diverse di una riga solo dopo che è stata modificata e prima che sia stato chiamato il AcceptChanges metodo . Dopo che il AcceptChanges metodo è stato chiamato, le versioni correnti e originali sono le stesse.

Il passaggio del DataRowVersion valore insieme all'indice di colonna (o al nome di colonna come stringa) restituisce il valore dalla versione di riga specifica della colonna. La colonna modificata viene identificata durante gli ColumnChanging eventi e ColumnChanged . Questo è un buon momento per esaminare le diverse versioni di riga a scopo di convalida. Tuttavia, se sono stati temporaneamente sospesi vincoli, tali eventi non verranno generati e sarà necessario identificare a livello di codice le colonne modificate. A tale scopo, è possibile scorrere la Columns raccolta e confrontare i diversi DataRowVersion valori.

Per ottenere la versione originale di un record

  • Accedere al valore di una colonna passando l'oggetto DataRowVersion della riga che si desidera restituire.

    Nell'esempio seguente viene illustrato come usare un DataRowVersion valore per ottenere il valore originale di un CompanyName campo in un DataRowoggetto :

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

Accedere alla versione corrente di un DataRow

Per ottenere la versione corrente di un record

  • Accedere al valore di una colonna e quindi aggiungere un parametro all'indice che indica quale versione di una riga si desidera restituire.

    Nell'esempio seguente viene illustrato come usare un DataRowVersion valore per ottenere il valore corrente di un CompanyName campo in un DataRowoggetto :

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();