Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - DBConcurrencyException verhindern [SQL compact]
m-s - Di 17.05.11 11:17
Titel: DBConcurrencyException verhindern [SQL compact]
Hallo Zusammen,
ich lade in einem Programm Daten von Google herunter und speichere Sie in einer lokalen Datenbank.
Derzeit gibt es keinen Sync, so das ich die lokalen Daten immer lösche und durch die Heruntergeladenen ersetze.
Wenn ich den Button zwei mal hintereinander drücke bekomme ich eine DBConcurrencyException.
In dem Button lösche ich die vorhandenen Daten, hole sie von Google, und Berechne zwei Felder in zwei auf dem Form angezeigten DataViewGrids
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| private void btn_log_einlesen_Click(object sender, EventArgs e) { ArbeitszeitenLeeren(); Tabelle(); hatOffenePos(); arbeitszeitBerechnen(); } |
Das Löschen mache ich so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void ArbeitszeitenLeeren() { if (arbeitslogDataSet.Arbeitszeiten.Rows.Count != 0) { for (int i = 0; i < arbeitslogDataSet.Arbeitszeiten.Rows.Count; i++) arbeitslogDataSet.Arbeitszeiten.Rows[i].Delete(); arbeitszeitenSpeichern(); } } |
Speichern geht dann so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public void arbeitszeitenSpeichern() { try { this.Validate(); this.arbeitszeitenBindingSource.EndEdit(); this.arbeitszeitenTableAdapter.Update(arbeitslogDataSet.Arbeitszeiten); } catch (DBConcurrencyException ex) { MessageBox.Show("Fehler beim Speichern der Arbeitszeiten" + ex); } catch (InvalidOperationException ex) { MessageBox.Show("Fehler beim Speichern der Arbeitszeiten" + ex); } } |
Dabei kracht es dann, wenn ich das zwei mal hintereinander mache.
Was kann ich denn machen um tableadapter und dataset auf jeden Fall zu schreiben, damit es die DBConcurrencyException nicht mehr gibt?
Oder wie löst man so ein Problem?
m-s - Di 17.05.11 14:09
Habe, nach Lektüre vieler Einträge hier, mal weiter experimentiert und es scheint, wenn ich die Methode ArbeitszeitenLeeren ändere, gibt es die Probleme nicht.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private void ArbeitszeitenLeeren() { if (arbeitslogDataSet.Arbeitszeiten.Rows.Count != 0) { arbeitslogDataSet.Arbeitszeiten.Clear(); } } |
m-s - Di 17.05.11 14:42
Dafür werden die vorhandenen Einträge dann auch nicht mehr gelöscht.
Ich verstehe das nicht.
Kann mir mal jemand auf die Sprünge helfen.
Ich möchte eine Tabelle in der Datenbank löschen und neu befüllen, das müsste ja eigentlich gar kein Problem sein.
m-s - Mi 18.05.11 16:32
Meine Schwester würde sagen ich habe nen Punkt auf der Akte :)
Keiner Lust mir zu helfen?
Trashkid2000 - Mi 18.05.11 21:33
Hallo,
naja, ist nicht ganz so einfach zu helfen. Jedenfalls nicht in einem Satz.
Also, Du musst schon die Rows in der Table auf den Status "Deleted" setzen, wenn sie denn beim Update gelöscht werden sollen. Es reicht nicht, die Table einfach zu clearen.
Bei row.Delete() wird wie gesagt die Row auf den Staus "Deleted" gesetzt, und bei einem Update dann wirklich in der Datenbank gelöscht. Und auch aus dem DataSet.
Hast Du denn sowohl in der Tablle in der Datenbank als auch im DataSet einen Primärschlüssel definiert? Oder ist in der DB-Tabelle eine Spalte, die nicht im DataSet ist? Was anderes zu der Exception fällt mir grad nicht ein.
Manchmal reicht auch einfach das neue Erstellen des DataSets. So blöd es sich auch anhört.
LG
m-s - Mi 18.05.11 23:18
Ich kann gar nicht sagen wie oft ich meinen Code bezüglich des Löschen der Zeilen und des Speichern geändert habe.
Auf den Hinweis hin das das Clear nicht reicht, sondern row.delete sein muss, habe ich die kleine Schleife (s.o.) wieder aktiviert und das Clear() rausgenommen.
Nun geht es und es gibt auch keine Fehler mehr wenn ich den Vorgang mehrfach hintereinander starte.
Vermutlich habe ich beim rumtesten wegen des Löschens gleich den Rest mit behoben :)
Jedenfalls vielen Dank, dass Ihr mich in die richtige Richtung geschubst habt. Jetzt funktioniert es anscheinend.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!