HowTo: OleDb Concurrency Vilation bei Update Delete etc.



  • Noch etwas, was mich schon zum Wahnsinnig werden brachte:

    Wenn man Klassen basierend auf DbDataAdapter verwendet und über den Wizzard konfiguriert, wird ein SQL Statement eingesetzt, das schnell zu Concurrency Violation führen kann.

    In dem eingesetzten SQL Statement wird mehr abgefragt als man benötigt. So kann eine Änderung eines Wertes zu Problemen führen wenn plötzlich mehr als ein Datensatz passen könnte.

    Man kann das Statement jedoch deutlich abspecken und diese Probleme umgehen. So wird z.B. aus dem vom Wizzard generierten SQL Statement:

    UPDATE    Artikel
    SET              Artikelname = ?, [Lieferanten-Nr] = ?, [Kategorie-Nr] = ?, Liefereinheit = ?, Einzelpreis = ?, Lagerbestand = ?, BestellteEinheiten = ?, 
                          Mindestbestand = ?, Auslaufartikel = ?
    WHERE     ([Artikel-Nr] = ?) AND (? = 1 AND Artikelname IS NULL OR
                          Artikelname = ?) AND (? = 1 AND [Lieferanten-Nr] IS NULL OR
                          [Lieferanten-Nr] = ?) AND (? = 1 AND [Kategorie-Nr] IS NULL OR
                          [Kategorie-Nr] = ?) AND (? = 1 AND Liefereinheit IS NULL OR
                          Liefereinheit = ?) AND (? = 1 AND Einzelpreis IS NULL OR
                          Einzelpreis = ?) AND (? = 1 AND Lagerbestand IS NULL OR
                          Lagerbestand = ?) AND (? = 1 AND BestellteEinheiten IS NULL OR
                          BestellteEinheiten = ?) AND (? = 1 AND Mindestbestand IS NULL OR
                          Mindestbestand = ?) AND (? = 1 AND Auslaufartikel IS NULL OR
                          Auslaufartikel = ?)
    

    ein deutlich abgespecktes

    UPDATE    Artikel
    SET              Artikelname = ?, [Lieferanten-Nr] = ?, [Kategorie-Nr] = ?, Liefereinheit = ?, Einzelpreis = ?, Lagerbestand = ?, BestellteEinheiten = ?, 
                          Mindestbestand = ?, Auslaufartikel = ?
    WHERE     ([Artikel-Nr] = ?)
    

    (Nordwind.mdb => Artikel)

    Nun wird nurnoch der Primärschlüssel verwendet und den DbDataAdapter Klassen fällt es deutlich leichter den Datensatz zu bestimmen.



  • => FAQ - das könnte durchaus noch jemanden helfen 🙂



  • Ich verstehe den Zusammenhang mit C++/CLI nicht...
    Auch könntest Du einfach das "Concurrency"-Checking abschalten...



  • Naja, man könnte auch das werfen von Exceptions abschalten wenn man von irgendwo her eine bekommt und nicht weiß wo.

    Der Zusammenhang zu C++/CLI hängt in der ADO.NET.

    Die damalige Suche nach diesem Problem über Googel brachte wenig Erfolg, daher sollten hier einfach ein paar Leute in diesem Forum einen Tip zum Thema bekommen.

    Nur weil hier keine einzige C++ Zeile steht muss es nicht heissen das es nichts mit C++ im zusammenhang mit .net zu tun hat. So ist z.B. das kommaproblem mit Access und OLE recht C++ spezifisch.



  • Du solltest zumindest noch erwähnen *welche* .NET-Klassen Du verwendet hast, die zu diesem problem geführt haben.
    PS: Was für ein Komma-Problem?



  • Ähm, ok hatte ich schlecht geschrieben - ein wenig umgeschrieben.

    Komma und Access

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-157907.html [link korrigiert]



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum FAQ - C++/CLI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hiho,

    der Beitrag hier ist völlig daneben gewesen.

    Das "komplexe" SQL Statement, welches durch den Wizzard aufgebaut wird, wird für die vollständige Datenparallelität verwendet.

    Da das ganze ja Verbindunglos abläuft, muss ADO.NET ja irgendwie prüfen können, ob sich der Originaldatensatz in der Datenbank geändert hat.

    Hierfür speichert das Dataset die Originalwerte und gleicht diese ab. Das "kompexe" SQL Statement verwendet in der WHERE Klausel alle Daten des Datensatzes mit den Originaldaten, also jenen, die anfangs in das Dataset gelesen wurden. Wird mit diesem WHERE Abschnitt kein Datensatz gefunden , wird die Concurrency"-Checking Ausnahme ausgelöst.

    Lässt man diese Prüfungen weg, so werden die Daten einfach geschrieben, ungeachtet ob sich Änderungen von einem anderen Client ergeben haben.

    Ich werde über das Thema einen neuen Artikel /FAQ Beitrag schreiben. Das obrige resultiert auf der Tatsache, das ich ohne mich einzulesen einem Projekt widmen musste.

    Den gesammten Thread kann man also bestenfalls verwenden um sich über mich Lustig zu machen, mehr Nährwert hat der nicht 😃

    http://msdn2.microsoft.com/de-de/library/cs6hb8k4(VS.80).aspx


Anmelden zum Antworten