Laden...

Problem beim Update der Access DB: Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der ...

Erstellt von roadrunner vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.750 Views
R
roadrunner Themenstarter:in
3 Beiträge seit 2014
vor 7 Jahren
Problem beim Update der Access DB: Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der ...

verwendetes Datenbanksystem: <MS ACCESS>

Hallo,

ich habe folgendes Problem. Ich lade Werte aus einer Datenbank verändere sie und möchte sie in die Datenbank zurückschreiben. Ich bekomme dann immer foglende Fehlermeldung:

Fehlermeldung:
An unhandled exception of type 'System.Data.DBConcurrencyException' occurred in System.Data.dll
Additional information: Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

Das Merkwürdige ist, dass es bei einer Tabelle funktionert, und bei der zweiten nicht.
Hier ist der Quellcode:

In Wirklichkeit ist er wesentlich komplexer, ich habe nur die relvanten Dinge rauskopiert, diese wurden auch so vorher durch entsprechendes Auskommentieren getestet.


            System.Data.OleDb.OleDbDataAdapter mDataAdapterT_RNG = null;
            System.Data.OleDb.OleDbDataAdapter mDataAdapterT_RNGPOS = null;

            //Laden der ersten Tabelle 
            
            mDataAdapterT_RNG = new OleDbDataAdapter("SELECT * FROM T_RNG  ; ", HM_DB_FUNC.DBConnection.get());
            OleDbCommandBuilder oleCommBuilder = new OleDbCommandBuilder(mDataAdapterT_RNG);
            DataTable T_RNG = new DataTable();
            mDataAdapterT_RNG.Fill(T_RNG);

            // Laden der zweiten Tabelle

            mDataAdapterT_RNGPOS = new OleDbDataAdapter("SELECT * FROM T_RNGPOS ORDER BY RNGNRPOS   ; ", HM_DB_FUNC.DBConnection.get() );
            OleDbCommandBuilder oleCommBuilder2 = new OleDbCommandBuilder(mDataAdapterT_RNGPOS);
            DataTable T_RNGPOS = new DataTable();
            mDataAdapterT_RNGPOS.Fill(T_RNGPOS);

            //Änder der Datensätze
            T_RNG.Rows[0]["RNGNAME1"] = "TEST TEST 20160619";
            T_RNGPOS.Rows[0]["RNGARTIKELBEZ"] = "TEST TEST 20160619";

            //zurückschrieben der Daten 
            mDataAdapterT_RNG.Update(T_RNG);  // Dies gibt KEINE Fehlermeldung
            mDataAdapterT_RNGPOS.Update(T_RNGPOS);  // Dies gibt DIE genannte Fehlermeldung

Ich habe schon div. Foren und Internetseiten durch und stehe total auf dem Schlauch.... auch die Tipps mit den float values greifen nicht--> sind nicht vorhanden.
Oder habe ich eine Kleinigkeit übersehen?

Ich bin für jeden Hinweis dankbar!

DANKE!

Hinweis von gfoidl vor 7 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 6.

3.825 Beiträge seit 2006
vor 7 Jahren

Hallo roadrunner,

die Fehlermeldung besagt dass der Datensatz, der geändert werden soll, nicht gefunden wird. Das kann passieren wenn der Datensatz inzwischen von einem anderen Benutzer geändert wurde. Das kann aber auch passieren wenn Rundungsfehler in float Spalten auftreten. Schau Dir mal das erzeugte SQL Update Kommando an 😉

Eine Lösung ist es auf optimistic locking umzustellen :

DbCommandBuilder cb = new SqlCommandBuilder();
cb.ConflictOption = ConflictOption.OverwriteChanges;

Jetzt musst Du aber selbst dafür sorgen dass kein anderer Benutzer den Datensatz inzwischen geändert hat, sonst werden dessen Änderungen überschrieben.

Grüße Bernd

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

R
roadrunner Themenstarter:in
3 Beiträge seit 2014
vor 7 Jahren

PERFEKT!

cb.ConflictOption = ConflictOption.OverwriteChanges

hat geholfen!

DANKE!

Das kein anderer Nutzer die Datensätze ändern kann ist bereits über Sperrobjekte gelöst, bin halt SAP geschädigt 😃.

Eine Fragen habe ich noch:

Wie kann ich mir das erzeugte SQL Kommando ansehen?

C
2.122 Beiträge seit 2010
vor 7 Jahren

Die Datenbank bzw. der Dataadapter braucht Kriterien um einen Datensatz zu identifizieren wenn er ihn ändern soll. Kann es sein dass du keine Schlüssel festgelegt hast an denen er sich orientieren kann? Prüf das nach.
Ich kann mir vorstellen wenn der Dataadapter keinen Schlüsselwert findet nimmt er eben alle Werte einer Zeile zur Suche nach dem Datensatz. Wenn nun einer dieser Werte inzwischen geändert wurde, kann er den Datensatz nicht mehr finden.
Wenn du jeder Zeile einen unveränderlichen Schlüssel gibst und der Adapter den auch erkennen kann, sollte das Problem behoben sein.

Was mich dabei allerdings wundert, du sagst du sperrst die Datensätze. Dann dürfte das gar nicht passieren.

3.825 Beiträge seit 2006
vor 7 Jahren

chilic : Doch, es kann passieren wenn Rundungsfehler in float auftreten. Hatte ich auch schon.

Einen eindeutigen Schlüssel braucht man natürlich, darf auch veränderbar sein.

SQL-Kommando ansehen :

string sql = da.UpdateCommand;

"da" ist der DataAdapter.

Grüße Bernd

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