Megosztás a következőn keresztül:


Adathalmazok adatainak ellenőrzése .NET-keretrendszeralkalmazásokban

Megjegyzés:

Az DataSet osztály és a kapcsolódó osztályok a 2000-es évek elejétől származó régi .NET-keretrendszer-technológiák, amelyek lehetővé teszik az alkalmazások számára a memóriában lévő adatokkal való munkát, miközben az alkalmazások leválasztva vannak az adatbázisról. A technológiák különösen hasznosak az olyan alkalmazások esetében, amelyek lehetővé teszik a felhasználók számára az adatok módosítását és a módosítások visszaállítását az adatbázisba. Bár az adathalmazok bizonyítottan sikeres technológiának számítanak, az új .NET-alkalmazásokhoz ajánlott az Entity Framework Core használata. Az Entity Framework természetesebb módot kínál a táblázatos adatok objektummodellként való használatához, és egyszerűbb programozási felülettel rendelkezik.

Az adatok ellenőrzése annak megerősítését biztosítja, hogy az adatobjektumokba bevitt értékek megfelelnek-e az adathalmaz sémáján belüli korlátozásoknak. Az ellenőrzési folyamat azt is megerősíti, hogy ezek az értékek az alkalmazáshoz létrehozott szabályokat követik. Érdemes ellenőrizni az adatokat, mielőtt frissítéseket küldene az alapul szolgáló adatbázisnak. Ez csökkenti a hibákat, valamint az alkalmazások és az adatbázis közötti forduló utak számát.

Ellenőrizheti, hogy az adathalmazba írt adatok érvényesek-e, ha érvényesítési ellenőrzéseket hoz létre magában az adathalmazban. Az adatkészlet a frissítés végrehajtásának módjától függetlenül ellenőrizheti az adatokat – akár közvetlenül egy űrlap vezérlői, akár egy összetevőn belül, akár más módon. Mivel az adatkészlet az alkalmazás része (az adatbázis háttérrendszerével ellentétben), logikus hely az alkalmazásspecifikus ellenőrzés létrehozásához.

Az ellenőrzés alkalmazásban történő hozzáadásának legjobb helye az adathalmaz részleges osztályának fájlja. A Visual Basicben vagy a Visual C#-ban nyissa meg az Adathalmaz-tervezőt , és kattintson duplán arra az oszlopra vagy táblára, amelyhez érvényesítést szeretne létrehozni. Ez a művelet megnyitja a kódfájlt, ahol létrehozhat egy ColumnChanging vagy RowChanging eseménykezelőt.

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

}

Az adatok ellenőrzése

Az adathalmazon belüli érvényesítés a következő módokon történik:

  • Saját alkalmazásspecifikus ellenőrzés létrehozásával ellenőrizheti az egyes adatoszlopok értékeit a módosítások során. A részletekért lásd: Hogyan: Az adatok ellenőrzése az oszlopmódosítások során.

  • Hozzon létre egy saját alkalmazásspecifikus ellenőrzést, amely képes ellenőrizni az adatokat az értékek között, miközben egy teljes adatsor módosul. További információért lásd Adatok ellenőrzése sormódosítások közben.

  • Kulcsok, egyedi megkötések stb. létrehozásával az adathalmaz tényleges sémadefiníciójának részeként.

  • Az objektum tulajdonságainak beállításával, például MaxLength, AllowDBNull és Unique.

Az objektum több eseményt is előállít DataTable , amikor változás történik egy rekordban:

  • Az ColumnChanging és ColumnChanged események az egyes oszlopok módosításai során és után kiváltódnak. Az ColumnChanging esemény akkor hasznos, ha bizonyos oszlopok módosításait szeretné ellenőrizni. A javasolt módosítással kapcsolatos információk argumentumként kerülnek átadásra az eseményhez.
  • Az RowChanging események és RowChanged események a sor bármely módosítása során és után keletkeznek. Az RowChanging esemény általánosabb. Azt jelzi, hogy a sor egy részén változás történik, de nem tudja, melyik oszlop változott.

Alapértelmezés szerint egy oszlop minden módosítása négy eseményt hoz létre. Az első az adott oszlophoz tartozó ColumnChanging és ColumnChanged események, amelyeket módosítanak. Ezután a RowChanging és a RowChanged események következnek. Ha több módosítást végez a soron, az események minden módosításhoz létrejönnek.

Megjegyzés:

Az adatsor BeginEdit metódusa minden egyes oszlopváltás után kikapcsolja a RowChanging és RowChanged eseményeket. Ebben az esetben az esemény csak akkor lesz előállítva, ha a EndEdit metódus meghívása megtörtént, amikor a rendszer csak egyszer emeli ki az RowChangingRowChanged eseményeket. További információt az adathalmaz kitöltése során a korlátozások kikapcsolása című témakörben talál.

A választott esemény attól függ, hogy milyen részletes legyen az érvényesítés. Ha fontos, hogy azonnal észlelje a hibát, amikor egy oszlop megváltozik, hozza létre az érvényesítést a ColumnChanging esemény használatával. Ellenkező esetben használja az eseményt RowChanging , amely több hibát is észlelhet egyszerre. Emellett ha az adatok úgy strukturáltak, hogy az egyik oszlop értéke egy másik oszlop tartalma alapján legyen érvényesítve, akkor az esemény során végezze el az RowChanging ellenőrzést.

A rekordok frissítésekor az DataTable objektum olyan eseményeket hoz elő, amelyekre a módosítások végrehajtásakor és a módosítások elvégzése után reagálhat.

Ha az alkalmazás gépelt adatkészletet használ, akkor erősen gépelt eseménykezelőket hozhat létre. Ez négy további beírt eseményt ad hozzá, amelyekhez kezelőket hozhat létre: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeletingés dataTableNameRowDeleted. Ezek a beírt eseménykezelők egy olyan argumentumot adnak át, amely tartalmazza a tábla oszlopneveit, amelyek megkönnyítik a kód írását és olvasását.

Adatfrissítési események

Esemény Leírás
ColumnChanging Az oszlopban lévő érték módosul. Az esemény átadja Önnek a sort és az oszlopot, valamint a javasolt új értéket.
ColumnChanged Az oszlopban lévő érték megváltozott. Az esemény átadja Önnek a sort és az oszlopot a javasolt értékkel együtt.
RowChanging Az objektumon DataRow végrehajtott módosítások hamarosan véglegesítésre kerülnek az adathalmazba. Ha még nem hívta meg a BeginEdit metódust, akkor a ColumnChanging esemény meghívása után az RowChanging esemény kerül kiváltásra minden olyan változásnál, amely egy oszlopot érint. Ha a változtatásokat megelőzően meghívta BeginEdit, az RowChanging eseményre csak akkor kerül sor, amikor meghívja a EndEdit metódust.

Az esemény átadja Önnek a sort, valamint egy értéket, amely jelzi, hogy milyen típusú műveletet (módosítás, beszúrás stb.) hajt végre.
RowChanged Egy sor módosult. Az esemény átad Önnek egy sort, majd egy értéket, amely jelzi, hogy milyen típusú műveletet (pl. módosítás, beszúrás) hajtanak végre.
RowDeleting Egy sor törlése folyamatban van. Az esemény átadja Önnek a sort, valamint egy értéket, amely jelzi, hogy milyen típusú műveletet (törlést) hajt végre.
RowDeleted Egy sor törölve lett. Az esemény átadja Önnek a sort, valamint egy értéket, amely jelzi, hogy milyen típusú műveletet (törlést) hajt végre.

A ColumnChanging, RowChangingés RowDeleting események a frissítési folyamat során jönnek elő. Ezek az események az adatok ellenőrzésére vagy más típusú feldolgozásra használhatók. Mivel a frissítés az események során folyamatban van, megszakíthatja azt egy kivétellel, amely megakadályozza a frissítés befejezését.

A ColumnChanged, RowChanged és RowDeleted az események olyan értesítési események, amelyek a frissítés sikeres befejezésekor jelennek meg. Ezek az események akkor hasznosak, ha egy sikeres frissítésen alapuló további műveletet szeretne elvégezni.

Adatok ellenőrzése oszlopmódosítások során

Megjegyzés:

Az Adathalmaz-tervező létrehoz egy részleges osztályt, amelyben érvényesítési logika adható hozzá egy adathalmazhoz. A tervező által létrehozott adatkészlet nem töröl vagy módosít kódot a részleges osztályban.

Az adatok akkor érvényesíthetők, ha egy adatoszlop értéke megváltozik az ColumnChanging eseményre válaszolva. Amikor az esemény fel van emelve, ez az esemény egy olyan eseményargumentumot (ProposedValue) ad át, amely az aktuális oszlophoz javasolt értéket tartalmazza. A tartalom e.ProposedValuealapján a következőt teheti:

  • Fogadja el a javasolt értéket úgy, hogy semmit sem tesz.

  • A javasolt érték elvetése az oszlophiba (SetColumnError) beállításával az oszlopváltozó eseménykezelőben.

  • Ha szeretné, egy vezérlő használatával ErrorProvider hibaüzenetet jeleníthet meg a felhasználónak. További információ: ErrorProvider összetevő.

Az ellenőrzés az esemény során RowChanging is elvégezhető.

Adatok ellenőrzése a sormódosítások során

Írhat kódot annak ellenőrzésére, hogy minden ellenőrizni kívánt oszlop olyan adatokat tartalmaz-e, amelyek megfelelnek az alkalmazás követelményeinek. Ehhez állítsa be az oszlopot úgy, hogy jelezze, hogy hibát tartalmaz, ha egy javasolt érték elfogadhatatlan. Az alábbi példák oszlophibát adnak meg, ha az Quantity oszlop értéke 0 vagy kevesebb. A sorváltó eseménykezelőknek az alábbi példákhoz kell hasonlítania.

Adatok ellenőrzése sorváltáskor (Visual Basic)

  1. Nyissa meg az adathalmazt a Adatkészlet-tervező-ben. További információ : Útmutató: Adathalmaz létrehozása az adathalmaz-tervezőben.

  2. Kattintson duplán az ellenőrizni kívánt táblázat címsorára. Ez a művelet automatikusan létrehozza az RowChangingDataTable adathalmaz részleges osztályfájljában lévő eseménykezelőt.

    Jótanács

    Kattintson duplán a táblanév bal oldalán a sorváltó eseménykezelő létrehozásához. Ha duplán kattint a tábla nevére, szerkesztheti azt.

    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
    

Adatok ellenőrzése sorváltáskor (C#)

  1. Nyissa meg az adathalmazt a Adatkészlet-tervező-ben. További információ : Útmutató: Adathalmaz létrehozása az adathalmaz-tervezőben.

  2. Kattintson duplán az ellenőrizni kívánt táblázat címsorára. Ez a művelet egy részleges osztályfájlt hoz létre a DataTable.

    Megjegyzés:

    Az Adathalmaz-tervező nem hoz létre automatikusan eseménykezelőt az RowChanging eseményhez. Létre kell hoznia egy metódust az RowChanging esemény kezeléséhez, és kódot kell futtatnia az esemény a tábla inicializálási metódusában való összekapcsolásához.

  3. Másolja a következő kódot a részleges osztályba:

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

A módosított sorok lekérdezése

Az adattáblák minden sora rendelkezik egy RowState tulajdonságmal, amely nyomon követi a sor aktuális állapotát az DataRowState enumerálás értékeinek használatával. A módosított sorokat egy adathalmazból vagy adattáblából visszaadhatja, ha meghívja a(z) GetChanges metódust egy DataSet vagy DataTable esetén. Ellenőrizheti a módosítások létezését az adathalmaz HasChanges metódusának meghívásával, a GetChanges hívása előtt.

Megjegyzés:

Miután véglegesíti az adathalmaz vagy adattábla módosításait (a AcceptChanges metódus meghívásával), a GetChanges metódus nem ad vissza adatokat. Ha az alkalmazásnak módosítania kell a sorokat, a metódus meghívása előtt fel kell dolgoznia a AcceptChanges módosításokat.

GetChanges Az adathalmaz vagy adattábla metódusának meghívása egy új adatkészletet vagy adattáblát ad vissza, amely csak a módosított rekordokat tartalmazza. Ha konkrét rekordokat szeretne lekérni – például csak új rekordokat vagy csak módosított rekordokat – az enumerálásból származó DataRowState értéket paraméterként továbbíthatja a GetChanges metódusnak.

DataRowVersion Az enumerálással elérheti egy sor különböző verzióit (például azokat az eredeti értékeket, amelyek egy sorban voltak a feldolgozás előtt).

Az összes módosított rekord lekérése egy adatkészletből

  • Hívja meg a GetChanges adathalmaz metódusát.

    Az alábbi példa létrehoz egy új, úgynevezett changedRecords adatkészletet, és feltölti azt egy másik, úgynevezett dataSet1adatkészlet összes módosított rekordjával.

    DataSet changedRecords = dataSet1.GetChanges();
    

Az összes módosított rekord lekérése egy adattáblából

  • Hívja meg a GetChanges metódust egy DataTable esetében.

    Az alábbi példa létrehoz egy új, úgynevezett changedRecordsTable adattáblát, és feltölti azt egy másik, úgynevezett dataTable1adattábla összes módosított rekordjával.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Egy adott sorállapotú összes rekord lekérése

  • Hívja meg egy GetChanges adathalmaz vagy adattábla metódusát, és adjon meg egy DataRowState számbavételi értéket argumentumként.

    Az alábbi példa bemutatja, hogyan hozhat létre egy új, úgynevezett addedRecords adathalmazt, és hogyan töltheti fel csak az dataSet1 adathalmazhoz hozzáadott rekordokkal.

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

    Az alábbi példa bemutatja, hogyan adható vissza a táblához Customers nemrég hozzáadott összes rekord:

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

Hozzáférés a DataRow eredeti verziójához

Az adatsorok módosításakor az adathalmaz megőrzi a sor eredeti (Original) és új (Current) verzióit is. A metódus meghívása előtt például az AcceptChanges alkalmazás hozzáférhet egy rekord különböző verzióihoz (az DataRowVersion enumerálásban meghatározottak szerint), és ennek megfelelően feldolgozhatja a módosításokat.

Megjegyzés:

A sorok különböző verziói csak a szerkesztés után és a metódus meghívása előtt AcceptChanges léteznek. A metódus meghívása AcceptChanges után az aktuális és az eredeti verziók megegyeznek.

Ha az értéket az DataRowVersion oszlopindexszel (vagy oszlopnévvel sztringként) együtt adja át, az adott oszlop adott sorverziójának értékét adja vissza. A módosított oszlopot a ColumnChanging és ColumnChanged események során azonosítják. Érdemes most ellenőrzésre megvizsgálni a különböző sorverziókat. Ha azonban ideiglenesen felfüggesztette a korlátozásokat, ezek az események nem jelennek meg, és programozott módon kell meghatároznia, hogy mely oszlopok módosultak. Ezt úgy teheti meg, hogy végigvezeti a Columns gyűjteményen, és összehasonlítja a különböző DataRowVersion értékeket.

Rekord eredeti verziójának lekérése

  • Az oszlop értékének eléréséhez adja meg a DataRowVersion visszaadni kívánt sor értékét.

    Az alábbi példa bemutatja, hogyan használható egy DataRowVersion érték egy CompanyName mező eredeti értékének lekérésére egy DataRow-ben.

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

A DataRow aktuális verziójának elérése

Rekord aktuális verziójának lekérése

  • Nyissa meg egy oszlop értékét, majd adjon hozzá egy paramétert az indexhez, amely jelzi, hogy a sor melyik verzióját szeretné visszaadni.

    Az alábbi példa bemutatja, hogyan használható a DataRowVersion érték egy DataRow-beli CompanyName mező aktuális értékének lekérésére.

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