Autor Beitrag
m-s
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Di 17.05.11 11:17 
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

ausblenden 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        private void ArbeitszeitenLeeren()
        {
            // Falls Daten in Arbeitszeiten vorhanden sind, diese löschen
            if (arbeitslogDataSet.Arbeitszeiten.Rows.Count != 0)
            {
                for (int i = 0; i < arbeitslogDataSet.Arbeitszeiten.Rows.Count; i++)
                    arbeitslogDataSet.Arbeitszeiten.Rows[i].Delete();
                // Daten speichen
                arbeitszeitenSpeichern();
            }
        }


Speichern geht dann so:

ausblenden 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?

_________________
Gruß Markus


Zuletzt bearbeitet von m-s am Di 17.05.11 22:32, insgesamt 2-mal bearbeitet
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void ArbeitszeitenLeeren()
        {
            // Falls Daten in Arbeitszeiten vorhanden sind, diese löschen
            if (arbeitslogDataSet.Arbeitszeiten.Rows.Count != 0)
            {
                arbeitslogDataSet.Arbeitszeiten.Clear();
            }
        }

_________________
Gruß Markus
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: 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.

_________________
Gruß Markus
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Mi 18.05.11 16:32 
Meine Schwester würde sagen ich habe nen Punkt auf der Akte :)

Keiner Lust mir zu helfen?

_________________
Gruß Markus
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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

Für diesen Beitrag haben gedankt: m-s
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 18.05.11 21:46 
Zuviel ausschnittsweiser Code um wirklich fundiert helfen zu können. Verdächtig finde ich zumindest das du in arbeitszeitenSpeichern nach dem update kein AcceptChanges auf deiner Datatable aufrufst.

Für diesen Beitrag haben gedankt: m-s
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: 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.

_________________
Gruß Markus