Laden...

Parallelitätsverletzung

Erstellt von SideKick vor 12 Jahren Letzter Beitrag vor 9 Jahren 11.549 Views
SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren
Parallelitätsverletzung

verwendetes Datenbanksystem: <Oracle zum Testen aber MDB>

Hallo,

Meine Fehlermeldung:

Parallelitätsverletzung : Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

ich habe schon mehrere Anleitungen und Tipps aus dem Internet und aus den Foren befolgt ... der Fehler ist immer noch da?

Ich habe auch schon versucht das Löschen mit folgenden Zeilen auszuführen ... kein Erfolg, hierbei wird der Datensatz nicht gelöscht?


Remove:
this.t_PROEJTZEITENBindingSource.RemoveCurrent();
this.db1DataSet.AcceptChanges();
this.t_PROEJTZEITENTableAdapter.Update(this.db1DataSet.T_PROEJTZEITEN);

Speichern der Daten mit ...
this.Validate();
this.t_PROEJTZEITENBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.db1DataSet); "HIER TRITT DER FEHELER AUF"

Ich habe auch eine Muster mit einer MDB angehängt.

Die Datenbank-Tabelle sind mit einer 1 zu n Beziehung verbunden.

Wie kann ich den Fehler Erzeugten:
1.) Neuer Datensatz
2.) Datensatz speichern
3.) Datensatz löschen
4.) Datensatz speichern => FEHLER !

Jetzt habe ich mir schon gedacht ich lasse das Speichern (Commit) einfach weg ?

Naja, es können ca. 20-50 (von 120) Personen das Programm gleichzeitig und unter Umständen den ganzen Tag geöffent haben. Bei einem Stromausfall oder sonstigen Probleme fehlen mir die Daten. Zudem habe ich eine MDI im Einsatz, die Benutzer wechselt mit sicherheit zwischen der Form "Eingabe" und der Form "View" wo sie eine umfassende Übersicht bekommen.

Das nur am Rande, wenn die Form "Eingabe" verlassen wird oder wenn ich mit den Navigations-Button zum nächsten Datensatz wechsle werden die Daten gespeichert (Commit) damit ich sie auch sofort in der View zu verfügung habe.

Im Internet konnte ich auch immer wieder lesen das die Datensätze verschoben sein könnten, eine Lösung dazu gab es nicht?

Ist mir auch irrgend wie klar, wenn mein Datensatz z.B. die ID "-2" hat und in meiner Datenbank die ID "232" vergeben hat, kann das nicht gehen!?

Autowert:
Ich habe in der Datenbank einen Autowert auf meine ID erstellt.
Mit Oracle mit einem Trigger und in der Testdatenbank(Microsoft - MDB) ging das irrgend wie automatisch.
Im DatenbankDesigner habe ich, da meine Datenbank keine nullen akzeptiert folgendes eingestellt:
AutoIncrement = true;
AutoIncrementSeed = -1
AutoIncrementStep = -1

Ich wünsch mir einfach nur das sich die Daten beim Speichern / Commit von der Datenbank mit den Daten aus meine DataSet / DataTable abgleichen

Viele Grüße
SideKick

3.825 Beiträge seit 2006
vor 12 Jahren

Parallelitätsverletzung : Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

Dieser Fehler besagt, dass der Datensatz inzwischen im SQL Server geändert wurde.

Also ändert zwischen Fill() und Update() entweder Deine Applikation den Datensatz, oder ein anderer User im Netzwerk.

Einen Datensatz löschst Du mit rw.Delete(), nicht mit Remove. Ich denke das weisst Du.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren

Dieser Fehler besagt, dass der Datensatz inzwischen im SQL Server geändert wurde.

Ok, habe ich verstanden.

Also ändert zwischen Fill() und Update() entweder Deine Applikation den Datensatz, oder ein anderer User im Netzwerk.

Ok, habe ich jetzt verstanden, Danke.

Einen Datensatz löschst Du mit rw.Delete(), nicht mit Remove. Ich denke das weisst Du.

Das habe ich getestet, aber es folgt der gleiche Fehler

DataView dv = new DataView(DataSet1.T_PROEJTZEITEN);
dv[bsProjektzeiten.Position].Row.Delete();

Inszwischen habe ich in mehreren Bücher und im Internet weiter nach dem Fehler gesucht und habe feststellen, mit einer Datenbank zu Programmieren ist sehr umfangreich.

Meine Oracle-Datenbank erzeugt die Sequenznummer (Sequences) die mit einem Trigger bei Erstellung einer neuen Zeile in der Spalte ID hinzugefügt wird. Das wuste ich selbstverständlich schon vorher, da ich sie selbst erzeugt hatte.

Wenn ich einen neuen Datensatz in meinem Programm erzeuge bekommt er einen Autowert (-1, -2, usw). Dies habe ich im Designer eingestellt.

Wenn ich nach jedem Speichern ein TableAdapter.Fill "this.taProjekteZeiten.Fill(this.dataSet1.T_PROJEKTE_ZEITEN);" mache gibt es keinen Fehler mehr. Jedoch wird mir dann immer der erste Datensatz angezeigt ! Ich denke das das auch nicht sauber Programmiert ist da jedes mal die komplette Tabelle neu geladen wird.

Mit den SQL-Befehlen "NEXTVAL" und "CURRVAL" kann man anscheinend _**einen **_Datensatz schreiben und bekommt anschließend die vergebene Sequenz-Nummer zurück. Das währe schon mal eine Lösung. (Noch nicht getestet)

Besser währe es jedoch wenn ich einen ganzen Satz von Daten schreiben und die neue vergebene ID in meiner DataSet-Tabelle übernehemen könnte, wie es in der Beschreibung (Link unten) steht.

Ich versuche im Augenblick den Autowert nach dem schreiben in der Datenbank mit den Daten der DataSet-Tabelle abzugleichen. Ein ähnlichen Code habe ich auf der Webseit http://msdn.microsoft.com/de-de/library/bb399230%28v=VS.90%29.aspx gefunden.

Dieses Beispiel wurde mit den Microsoft-Oracle-Verweise / Klassen verwirklicht. Ich benutze jedoch die "Oracle Database Extension für .NET" die sehr ähnlich sind.

Ach ja, ich habe da noch mal was gefunden im DataSet-Desinger => MeineTabelle => Rechstklick auf MeinTableAdapter => Konfigurieren... => Erweiterte Optionen... => Da gibt es ein Kontrollkästchen "Datentabelle aktualisieren". Leider ist dieses Kontrollkästchen deaktiviert? Ob das eine Möglichkeit ist weis ich leider noch nicht.

So, jetzt ist es schon Spät, ich werden Morgen weiter machen und mich wieder melden.

Falls noch jemand eine Idee hat währe ich natürlich sehr Dankbar darüber.

SideKick 😃

SideKick Themenstarter:in
33 Beiträge seit 2011
vor 12 Jahren

Hallo,

nach dem ich überhaupt kapiert habe was für ein Problem ich habe, fand ich eine Lösung für mein Problem.

Access-DB - TableAdapter - Datensatz einfügen - Primärschlüssel Problem

Auslesen des neuen Wertes der Schlüsselspalte nach dem Erstellen eines neuen Datensatzes mit @@Identity

Danke an @ErfinderDesRades, @INOPIAE und @BerndFfm

Ob ich es wirklich richtig gemacht habe weis ich jedoch nicht wirklich, da ich auf der Datenbank-Wissensleiter noch nicht sehr hoch geklettert bin.

Es währe schön wenn ich noch ein kleines Feedback bekommen würde.

ich habe die Codes für meine Bedürfnisse (Oracle) angepasst.




using System.Data;
using Oracle.DataAccess.Client;

//Konstruktor
public frmProjektzeiten()
{
    //Damit das Ereignis auslöst !
    _PROJEKTE_ZEITENTableAdapter.Adapter.RowUpdated += new OracleRowUpdatedEventHandler(OnRowUpdated);
}


//Für Oracle
private OracleCommand _IdentityCommand = new OracleCommand("SELECT T_PROJEKTE_ZEITEN_SEQ.CURRVAL FROM DUAL");

private void OnRowUpdated(Object sender, OracleRowUpdatedEventArgs e)
{
	if (e.StatementType == StatementType.Insert)
	{
		_IdentityCommand.Connection = e.Command.Connection;
		_IdentityCommand.Transaction = e.Command.Transaction;

		//Schreibe die von der DB zugewiesenen ID in die DataTable-Row
		e.Row["ID"] = Convert.ToInt32(_IdentityCommand.ExecuteScalar());
	}
}


Für alle die wie ich noch nicht so hoch auf der Wissensleiter stehen ...

Was wahr das Problem?* Wenn ich einen Datensatz anlege bekommt er eine vorübergehende ID (-1,-2,-3 usw).

  • Da der Benutzer zwischen verschiedene Formen hin- und her wechseln kann (MDI) soll dieser Datensatz beim Verlassen gespeichert werden.
  • Beim Speichern bekommt der Datensatz in der Datenbank durch einen Trigger/Sequenz einen Autowert
  • Jetzt kann es vorkommen das der Benuzter den angelegten Datensatz wieder löschen muß.
  • Das Problem ist jetzt das die ID von der Datenbank und die von dem DataTable nicht mehr übereinstimmen, und ein Fehler erzeugt wird ...
  • "Parallelitätsverletzung der updatecommand hat sich auf 0 der erwarteten 1 datensätze ausgewirkt"

Nachdem ich den Code oben eingesetzt habe ...
Nun wird nach jedem Speichern, die ID der Datenbank, mit der ID der DataTable-Row synchronisiert 😃 und die Parallelitätsverletzung vermieden.

Schöne Grüße
SideKick

3.825 Beiträge seit 2006
vor 9 Jahren

Hallo,

nach 3 Jahren schreibe ich mal wieder etwas in diesem Thread, vielleicht hilft es jemandem, der per Suchfunktion hierher kommt.

Heute hatte ich den Fehler "Parallelitätsverletzung" bei einer MySQL Datenbank.

Nach mehreren Stunden Suche habe ich den Fehler gefunden :

Es gibt in der Datenbank einige Double-Felder, die errechnete Werte beinhalten. Beim errechnen gibt es Rundungsdifferenzen, so dass die Zahl viele Nachkommastellen hat.

Beim Laden wird die Zahl vom ADO.NET Provider auf 10 Nachkommastellen gerundet.

Da die Zahl nun nicht mehr mit der Zahl in der Datenbank übereinstimmt wird der Datensatz nicht mehr gefunden und beim ds.Update() kommt die Fehlermeldung "Parallelitätsverletzung : Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt."

Abhilfe : Zahlen vor dem Speichern immer runden.

Oder : Datentyp 'Decimal' verwenden.

Oder, schlechter, ab Framework 4.5 : cmd.ConflictOption = ConflictOption.OverwriteChanges

Meiner Meinung nach ist das ein Fehler im ADO.NET Treiber von MySQL.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 9 Jahren

Die Conflictoption im CommandBuilder gibt es Seit FW 2

3.825 Beiträge seit 2006
vor 9 Jahren

Danke, da hab ich mich verlesen.

Es sollte auch so heissen :

 cb.ConflictOption = ConflictOption.OverwriteChanges;

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3