Announcement

Collapse
No announcement yet.

Parallelitätskonflikte bei TableAdapter(Update)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Parallelitätskonflikte bei TableAdapter(Update)

    Hallo,

    beim Abspeichern eines geänderten Datensatzes mit:

    - Me.Validate
    - BindingSource.EndEdit
    - TableAdapterUpdate(MeineTabelle)

    werden die neuen Daten tatsächlich in die DB geschrieben. Meine BindingSource und die Tabelle in der DB sind synchron.

    Aber:

    beim Abspeichern eines neuen Datensatzes auf die gleiche Art wird zwar auch der neue Datensatz in die DB (Access) geschrieben, jedoch sind danach meine BindingSource und die DB Tabelle nicht mehr synchron. D.h., wenn ich an dem frischen Datensatz in meiner BindingSource Änderungen vornehme und mit TableAdapterUpdate(MeineTabelle) diese Änderungen dann in die Tabelle schreiben möchte, kommt ein Parallelitätskonflikt.

    Das Problem kann ich lösen, indem ich bei Abspeichern eines neuen Datensatz dem Update ein TableAdapterFill(MeineTabelle) folgen lasse, also die ganze Table noch mal in die BindingSource einlese. Danach ist wieder alles schön synchron.

    Wie kann ich das Prallelitäts-Problem lösen, ohne die ganze Table (ca.5000 Datensätze) bei Neuanlage eines Datensatzes einlesen zu müssen?

    Für jede Hilfe dankbar!

  • #2
    Hallo,

    wenn als Datenbank ein echter SQL Server verwendet wird, baut der TableAdapter-Assistent alle benötigten Zutaten automatisch zusammen. Da der MS SQL Server den Batch-Betrieb (d.h. das Ausführen von mehreren Anweisungen) unterstützt, wird nach dem INSERT sofort ein SELECT für den neu eingefügten Datensatz ausgeführt. Die vom SQL Server vergebenen Werte (IDENTITY-Spalte, Trigger, DEFAULT usw.) sind daher sofort im DataSet sichtbar, so dass nachfolgende Änderungen möglich sind.

    Wenn die Datenbank - so wie im Fall von ACCESS - den Batch-Betrieb nicht unterstützt, muss man dieses Verhalten von Hand nachbauen. Wenn der neue Datensatz über die Feldwerte logisch eindeutig gefunden werden kann, reicht es aus, nur diesen einen Datensatz nachzuladen und über die DataSet-Methode Merge in das bereits gefüllte DataSet einzumischen.

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für die wirklich kompetente Antwort.
      So wie Du vorgeschlagen hast, lese ich jetzt mittels eines SELECT (Abfrage im TableAdapter) den neuen gespeicherten Satz sofort mit Hilfe der ID in eine temporäre DataTable zurück und merge diese dann mit der Ursprungstabelle.
      Klappt wunderbar.

      Herzlichen Dank (oh Du mein Forenheld!)

      Manfred

      Comment

      Working...
      X