Avatar billede neoman Novice
02. juni 2007 - 17:13 Der er 1 løsning

Concurrency, referential integrity violations - how to handle?

Jeg har 3 tabeller med relationer og update/cascade delete oprettet både i dataset og DB. En ASPX side læser tabellerne ind i et dataset vha TableAdapters, brugeren laver ændringer indtil tilfreds og derpå gemmer data.

I et multiuser miljø, kan nogle brugere delete noget i en tabel, mens andre retter noget i en anden tabel. Dette vil ved gemning af data afstedkomme forskellige violations.

Jeg kan fint fange dem i TabelAdapterens RowUpdated event handler.


De eksempler jeg har set, kører adapaterens .Update metode i  en try/catch blok, og håndterer således  EEN exception ad gangen dér.

Jeg savner et eksempel på taktik til at håndtere en situation, hvor der kan forekomme mange fejl.

Jeg ønsker at min process ikke stopper, men at den fortsætter Db-opdateringen indtil alle ændrede rækker har været igennem processen. Derpå skal der for brugeren præsenteres en liste over de fejl der har været. Dette fordi brugeren rent umiddelbart intet kan stille op, men skal dog gøres opmærksom på, at nogle ting ikke gik som han forventede.


Mit største problem vedrører udførelse af punkt 3 i følgende liste:

1. En tabel har ændringer i nogle rækker og DB'en skal opdateres passende.
2. Concurrency/integrity violations fanges i TableAdapterens RowUpdated event - det har jeg igen problemer med.
3. En violation skal ikke føre til at opdateringen stopper, men info om den specifikke række og typen af violation  skal gemmes på en eller anden måde.
4. En liste af fejl skal vises efter processen er løbet igennem alle ændrede rækker.

Jeg har mange ideer til hvordan man kunne gøre det, men det kunne være nogen havde kendskab til et passende eksempel.
Avatar billede neoman Novice
02. juni 2007 - 20:23 #1
Som sædvanligt, først det øjeblik jeg stiller spørgsmålet på E, SÅ kan jeg finde de rette ting i Google.

Det viser sig at man for en TableAdapter selv kan/skal tilføje en ContinueUpdateOnError property, som i dette eksempel:

Namespace AdventureWorksDataSetTableAdapters
    Partial Public Class EmployeeTableAdapter
        Public Event FillError(ByVal sender As Object, ByVal e As FillErrorEventArgs)

        Private Sub _adapter_FillError(ByVal sender As Object, ByVal e As System.Data.FillErrorEventArgs) Handles _adapter.FillError
            RaiseEvent FillError(sender, e)
        End Sub

        Public Property ContineUpdateOnError() As Boolean
            Get
                Return _adapter.ContinueUpdateOnError
            End Get
            Set(ByVal value As Boolean)
                _adapter.ContinueUpdateOnError = value
            End Set
        End Property

    End Class
End Namespace

Så kører en Save helt til enden. Derpå kan man checke på HasError property for tabellen, og if true, så kan man få de rækker ud som har fejl. Udfra indholdet af rækkens RowStatus samt RowError properties, kan man så træffe passende forholdsregler.

På denne måde behøver man end ikke at lave noget i RowUpdated eventet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester