Dela via


Verifiera data i datauppsättningar i .NET Framework-program

Anmärkning

Klassen DataSet och relaterade klasser är äldre .NET Framework-tekniker från början av 2000-talet som gör det möjligt för program att arbeta med data i minnet medan apparna kopplas från databasen. Teknikerna är särskilt användbara för appar som gör det möjligt för användare att ändra data och spara ändringarna tillbaka till databasen. Även om datauppsättningar är en bevisad framgångsrik teknik är den rekommenderade metoden för nya .NET-program att använda Entity Framework Core. Entity Framework är ett mer naturligt sätt att arbeta med tabelldata som objektmodeller och har ett enklare programmeringsgränssnitt.

Validering av data är processen att bekräfta att de värden som anges i dataobjekt överensstämmer med begränsningarna i en datauppsättnings schema. Valideringsprocessen bekräftar också att dessa värden följer de regler som har upprättats för ditt program. Det är en bra idé att verifiera data innan uppdateringar skickas till den underliggande databasen. Detta minskar både felen och det potentiella antalet tur- och returresor mellan ett program och databasen.

Du kan bekräfta att data som skrivs till en datamängd är giltiga genom att skapa valideringskontroller i själva datauppsättningen. Datauppsättningen kan kontrollera data oavsett hur uppdateringen utförs – oavsett om den utförs direkt av kontroller i ett formulär, i en komponent eller på något annat sätt. Eftersom datamängden är en del av ditt program (till skillnad från databasserverdelen) är det en logisk plats att skapa programspecifik validering på.

Det bästa stället att lägga till validering i ditt program finns i datauppsättningens partiella klassfil. I Visual Basic eller Visual C# öppnar du Datauppsättningsdesignern och dubbelklickar på kolumnen eller tabellen som du vill skapa verifiering för. Den här åtgärden öppnar kodfilen, där du kan skapa en ColumnChanging eller RowChanging händelsehanterare.

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

}

Verifiera data

Validering i en datauppsättning utförs på följande sätt:

Flera händelser skapas av DataTable-objektet när en ändring sker i en datapost.

  • Händelserna ColumnChanging och ColumnChanged genereras under och efter varje ändring i en enskild kolumn. Händelsen ColumnChanging är användbar när du vill verifiera ändringar i specifika kolumner. Information om den föreslagna ändringen skickas som ett argument med händelsen.
  • Händelserna RowChanging och RowChanged utlöses under och efter varje förändring i en rad. Händelsen RowChanging är mer allmän. Det anger att en ändring sker någonstans på raden, men du vet inte vilken kolumn som har ändrats.

Som standard genererar varje ändring i en kolumn därför fyra händelser. Den första är ColumnChanging och ColumnChanged händelserna för den specifika kolumn som ändras. Härnäst är RowChanging och RowChanged händelserna. Om flera ändringar görs i raden genereras händelserna för varje ändring.

Anmärkning

Dataradens BeginEdit metod inaktiverar RowChanging händelserna och RowChanged efter varje enskild kolumnändring. I så fall utlöses inte händelsen förrän EndEdit metoden har anropats, när RowChanging händelserna och RowChanged aktiveras bara en gång. Mer information finns i Inaktivera begränsningar när du fyller i en datauppsättning.

Vilken händelse du väljer beror på hur detaljerad du vill att verifieringen ska vara. Om det är viktigt att du får ett fel direkt när en kolumn ändrar sig, skapar du validering med hjälp av ColumnChanging händelsen. Annars kan du använda RowChanging eventet, vilket kan resultera i att flera fel fångas samtidigt. Om dina data är strukturerade så att värdet för en kolumn verifieras baserat på innehållet i en annan kolumn, utför du dessutom verifieringen RowChanging under händelsen.

När poster uppdateras DataTable genererar objektet händelser som du kan svara på när ändringar inträffar och efter att ändringar har gjorts.

Om ditt program använder en typad datauppsättning kan du skapa starkt skrivna händelsehanterare. Detta lägger till ytterligare fyra inskrivna händelser som du kan skapa hanterare för: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeletingoch dataTableNameRowDeleted. Dessa inskrivna händelsehanterare skickar ett argument som innehåller kolumnnamnen för tabellen som gör koden enklare att skriva och läsa.

Datauppdateringshändelser

Evenemang Beskrivning
ColumnChanging Värdet i en kolumn ändras. Händelsen skickar raden och kolumnen till dig, tillsammans med det föreslagna nya värdet.
ColumnChanged Värdet i en kolumn har ändrats. Händelsen skickar raden och kolumnen till dig, tillsammans med det föreslagna värdet.
RowChanging De ändringar som har gjorts i ett DataRow-objekt är på väg att återinföras i datauppsättningen igen. Om du inte har anropat BeginEdit metoden RowChanging genereras händelsen för varje ändring till en kolumn direkt efter att händelsen ColumnChanging har skapats. Om du anropade BeginEdit innan du gjorde ändringar RowChanging utlöses händelsen endast när du anropar EndEdit metoden.

Händelsen skickar raden till dig, tillsammans med ett värde som anger vilken typ av åtgärd (ändring, infogning och så vidare) som utförs.
RowChanged En rad har ändrats. Händelsen skickar raden till dig, tillsammans med ett värde som anger vilken typ av åtgärd (ändring, infogning och så vidare) som utförs.
RowDeleting En rad tas bort. Händelsen skickar raden till dig, tillsammans med ett värde som anger vilken typ av åtgärd (ta bort) som utförs.
RowDeleted En rad har tagits bort. Händelsen skickar raden till dig, tillsammans med ett värde som anger vilken typ av åtgärd (ta bort) som utförs.

Händelserna ColumnChanging, RowChangingoch RowDeleting genereras under uppdateringsprocessen. Du kan använda dessa händelser för att verifiera data eller utföra andra typer av bearbetning. Eftersom uppdateringen pågår under dessa händelser kan du avbryta den genom att utlösa ett undantag som förhindrar att uppdateringen slutförs.

ColumnChanged, RowChanged och RowDeleted är meddelandehändelser som utlöses när uppdateringen har slutförts. Dessa händelser är användbara när du vill vidta ytterligare åtgärder baserat på en lyckad uppdatering.

Verifiera data under kolumnändringar

Anmärkning

Datauppsättningsdesignern skapar en partiell klass där valideringslogik kan läggas till i en datauppsättning. Den designergenererade datauppsättningen tar inte bort eller ändrar ingen kod i den partiella klassen.

Du kan verifiera data när värdet i en datakolumn ändras genom att ColumnChanging svara på händelsen. När den här händelsen genereras skickas ett händelseargument (ProposedValue) som innehåller det värde som föreslås för den aktuella kolumnen. Baserat på innehållet i e.ProposedValuekan du:

  • Acceptera det föreslagna värdet genom att inte göra någonting.

  • Vägra det föreslagna värdet genom att ange kolumnfelet (SetColumnError) inifrån händelsehanteraren för kolumnändring.

  • Du kan också använda en ErrorProvider kontroll för att visa ett felmeddelande för användaren. Mer information finns i ErrorProvider-komponenten.

Verifiering kan också utföras under RowChanging händelsen.

Verifiera data vid radändringar

Du kan skriva kod för att kontrollera att varje kolumn som du vill verifiera innehåller data som uppfyller kraven för ditt program. Gör detta genom att ange kolumnen så att den innehåller ett fel om ett föreslaget värde är oacceptabelt. I följande exempel anges ett kolumnfel när Quantity kolumnen är 0 eller mindre. Händelsehanterarna för radbyte bör likna följande exempel.

Verifiera data när en rad ändras (Visual Basic)

  1. Öppna datauppsättningen i Dataset Designer. Mer information finns i Genomgång: Skapa en datauppsättning i Datauppsättningsdesignern.

  2. Dubbelklicka på titelraden i tabellen som du vill verifiera. Den här åtgärden skapar RowChanging automatiskt händelsehanteraren för DataTable i datauppsättningens partiella klassfil.

    Tips/Råd

    Dubbelklicka till vänster om tabellnamnet för att skapa händelsehanteraren för radbyte. Om du dubbelklickar på tabellnamnet kan du redigera det.

    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
    

Verifiera data när en rad ändras (C#)

  1. Öppna datauppsättningen i Dataset Designer. Mer information finns i Genomgång: Skapa en datauppsättning i Datauppsättningsdesignern.

  2. Dubbelklicka på titelraden i tabellen som du vill verifiera. Den här åtgärden skapar en delklassfil för DataTable.

    Anmärkning

    Datauppsättningsdesignern skapar inte automatiskt en händelsehanterare för RowChanging händelsen. Du måste skapa en metod för att hantera RowChanging händelsen och köra kod för att ansluta händelsen i tabellens initieringsmetod.

  3. Kopiera följande kod till den partiella klassen:

    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", "");
        }
    }
    

Hämta ändrade rader

Varje rad i en datatabell har en RowState egenskap som håller reda på radens aktuella tillstånd med hjälp av värdena i DataRowState uppräkningen. Du kan returnera ändrade rader från en datauppsättning eller datatabell genom att anropa GetChanges metoden för en DataSet eller DataTable. Du kan kontrollera att det finns ändringar innan du anropar GetChanges genom att anropa metoden för HasChanges en datauppsättning.

Anmärkning

När du har sparat ändringar i en datauppsättning eller datatabell (genom att anropa AcceptChanges metoden), returnerar GetChanges metoden inga data. Om ditt program behöver bearbeta ändrade rader måste du bearbeta ändringarna innan du AcceptChanges anropar metoden.

Om du anropar metoden för GetChanges en datauppsättning eller datatabell returneras en ny datamängd eller datatabell som endast innehåller poster som har ändrats. Om du vill hämta specifika poster , till exempel endast nya poster eller endast ändrade poster, kan du skicka ett värde från DataRowState uppräkningen som en parameter till GetChanges metoden.

DataRowVersion Använd uppräkningen för att komma åt de olika versionerna av en rad (till exempel de ursprungliga värden som fanns i en rad innan den bearbetades).

Hämta samtliga ändrade poster från en datauppsättning

  • Anropa GetChanges-metoden på en datamängd.

    I följande exempel skapas en ny datauppsättning med namnet changedRecords och fylls i med alla ändrade poster från en annan datauppsättning med namnet dataSet1.

    DataSet changedRecords = dataSet1.GetChanges();
    

Hämta alla ändrade poster från en databas

  • Anropa metoden GetChanges för en DataTable.

    I följande exempel skapas en ny datatabell med namnet changedRecordsTable och fylls i med alla ändrade poster från en annan datatabell med namnet dataTable1.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Hämta alla poster som har ett specifikt radtillstånd

  • Anropa metoden för GetChanges en datamängd eller datatabell och skicka ett DataRowState uppräkningsvärde som ett argument.

    I följande exempel visas hur du skapar en ny datauppsättning med namnet addedRecords och fyller den endast med poster som har lagts till i datauppsättningen dataSet1 .

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

    I följande exempel visas hur du returnerar alla poster som nyligen har lagts till i Customers tabellen:

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

Få åtkomst till den ursprungliga versionen av en DataRow

När ändringar görs i datarader behåller datauppsättningen både de ursprungliga (Original) och nya (Current) versionerna av raden. Innan du till exempel anropar AcceptChanges metoden kan ditt program komma åt de olika versionerna av en post (enligt definitionen i DataRowVersion uppräkningen) och bearbeta ändringarna i enlighet med detta.

Anmärkning

Det finns bara olika versioner av en rad efter att den har redigerats och innan metoden AcceptChanges har anropats. AcceptChanges När metoden har anropats är de aktuella och ursprungliga versionerna desamma.

Om du skickar DataRowVersion värdet tillsammans med kolumnindexet (eller kolumnnamnet som en sträng) returneras värdet från den kolumnens specifika radversion. Den ändrade kolumnen identifieras under händelserna ColumnChanging och ColumnChanged. Det här är ett bra tillfälle att inspektera de olika radversionerna i valideringssyfte. Men om du tillfälligt har pausat begränsningarna aktiveras inte dessa händelser, och du måste programmatiskt identifiera vilka kolumner som har ändrats. Du kan göra detta genom att iterera genom Columns samlingen och jämföra de olika DataRowVersion värdena.

Hämta den ursprungliga versionen av en post

  • Få åtkomst till värdet för en kolumn genom att skicka in den DataRowVersion rad som du vill returnera.

    I följande exempel visas hur du använder ett DataRowVersion värde för att hämta det ursprungliga värdet för ett CompanyName fält i ett DataRow:

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

Få åtkomst till den aktuella versionen av en DataRow

Hämta den aktuella versionen av en post

  • Få åtkomst till värdet för en kolumn och lägg sedan till en parameter i indexet som anger vilken version av en rad du vill returnera.

    I följande exempel visas hur du använder ett DataRowVersion värde för att hämta det aktuella värdet för ett CompanyName fält i ett DataRow:

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