Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann ich in Access eine Row aus dem DataGrid löschen?
Lucky_001
myCSharp.de - Member



Dabei seit:
Beiträge: 15
Herkunft: Holzwickede, NRW

Themenstarter:

Wie kann ich in Access eine Row aus dem DataGrid löschen?

beantworten | zitieren | melden

Hallo,
ich habe beim Löschen von einträgen in meiner MS Accses DB immer folgende Fehlermeldung:
Fehler
Parallelitätsverletzung: Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

Habe inzwischen drei tage lang im Internet gesucht nach der lösung, habe aber leider keine lösung gefunden für dieses Problem.

Ich habe heuch mal den Code des "Löschen"-Buttons rein gepackt:


private void btn_delete_Click(object sender, EventArgs e)   // Einträge X bis Y löschen
        {
            AddProtokoll(Leuchte, "910", "Es wird versucht Leuchten zu löschen.");
            try
            {
                Passwort pass = new Passwort(Passw);
                if (pass.ShowDialog() == DialogResult.OK)
                {
                    foreach (DataGridViewRow row in dGV_main.SelectedRows)
                    {
                        dGV_main.Rows.RemoveAt(row.Index); 
                        this.TA.Update(this.DS.Leuchten); // Hier schlägt er den Fehler aus
                    }
                    AddProtokoll(Leuchte, "911", "Leuchten wurden erfolgreich Glöscht.");
                }
                else
                {
                    MessageBox.Show("Zugriff Verweigert!", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    AddProtokoll(Leuchte, "! 912 !", "Löschen wurde verweigert!");
                }
            }
            catch (Exception ex)
            {
                AddProtokoll(Leuchte, ex.Data.ToString(), ex.Message);
            }
        }

Ich Danke für die antworten schonmal im vorraus.

MfG
Daniel S.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1767
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Anhand des Codes kann dir niemand sagen was die Ursache ist, da der eigentliche SQL Part nicht gezeigt wird.
Ansonsten klingt der Code auch falsch, da du eine Update Methode aufrufst, die Meldung aber darauf hindeutet, dass ein Eintrag per DELETE gelöscht werden soll den es so nicht gibt.

Anbei solltest du MS Access nie als DB verwenden.
Es ist auch nicht als Anwendungsdaten gedacht.
Dafür nimmt man i.d.R. embedded Datenbanken wie Sqlite.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #avatar-3299.jpg


Dabei seit:
Beiträge: 3699
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

RemoveAt(row.Index) löscht die Zeile aus dem DataSet im Speicher und ändert nichts in der Datenbank.

Damit die Zeile in der Datenbank gelöscht wird musst Du die Zeile im DataSet als Gelöscht markieren, mit Update() wird dann die Zeile in der Datenbank gelöscht.

Zeile in der Datenbank löschen : row.Delete()

Grüße Bernd
Die kostenlose Unternehmenssoftware : Die Quasar-3 Community Version
Workshop : Datenbanken mit ADO.NET
private Nachricht | Beiträge des Benutzers
Lucky_001
myCSharp.de - Member



Dabei seit:
Beiträge: 15
Herkunft: Holzwickede, NRW

Themenstarter:

beantworten | zitieren | melden

Hi,

ich habe es jetzt geändert. Meintest du es so Bernd?


foreach (DataGridViewRow row in dGV_main.SelectedRows)
                    {
                        dGV_main.Rows.RemoveAt(row.Index);
                        this.DS.Leuchten.Rows[row.Index].Delete();
                        this.TA.Update(this.DS.Leuchten);
                    }

Weil das geht leider ebenfalls nicht.

Eine etwas ältere version hat 1:1 den selben Code, jedoch funktionierte sie.

Daniel S.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #avatar-3299.jpg


Dabei seit:
Beiträge: 3699
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden


foreach (DataGridViewRow row in dGV_main.SelectedRows) row.Delete();
this.TA.Update(this.DS.Leuchten);

RemoveAt löscht die Zeile aus dem DataSet, also wird sie nicht in der Datenbank gelöscht oder geändert.

Der Code kann so nicht funktioniert haben weil Du eine Zeile auf "Deleted" setzt die Du vorher entfernt hast. Das geht nicht.

Grüße Bernd
Die kostenlose Unternehmenssoftware : Die Quasar-3 Community Version
Workshop : Datenbanken mit ADO.NET
private Nachricht | Beiträge des Benutzers
Lucky_001
myCSharp.de - Member



Dabei seit:
Beiträge: 15
Herkunft: Holzwickede, NRW

Themenstarter:

beantworten | zitieren | melden

Das row.Delete() geht nicht da es ja eine DatagridViewRow ist. ich mache immer this.DS.Leuchten.Rows[row.Index].Delete();

Allesdings gibt er jetzt wieder den selben fehler wie am anfang aus:
Fehler
Parallelitätsverletzung: Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

Ich bin langsam echt am verzweifeln woran das noch liegen kann.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10042

beantworten | zitieren | melden

Schon mal in die Doku geschaut, was Parallelitätsverletzung bedeutet??

Die Ausgangdsaten in deiner DataTable und die Daten in der DatenDatei ( Access ist keine Datenbank ) stimmen nicht mehr überein.

Das heißt in 99% der fälle, das du entweder ein falsches Update/Insert/Delete Statement generieren lässt, oder die Daten im DataSet sind nicht mehr gültig.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #avatar-3299.jpg


Dabei seit:
Beiträge: 3699
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

Ich hatte nicht gesehen dass es eine ViewRow ist.

Der Fehler besagt dass die Zeile im Dataset nicht mehr in der Datenbank gefunden wurde.

Sie wurde z.B. inzwischen von einem anderen Benutzer geändert.

Ich hatte den Fehler mal bei MySQL weil dort Zahlen falsch gerundet wurden und so der CommandBuilder die Zeile nicht mehr gefunden hat.

Lösung : Parallelitätsverletzung

Im Zweifel die SQL Kommandos anschauen und eventuell selber schreiben.

Grüße Bernd
Die kostenlose Unternehmenssoftware : Die Quasar-3 Community Version
Workshop : Datenbanken mit ADO.NET
private Nachricht | Beiträge des Benutzers
Lucky_001
myCSharp.de - Member



Dabei seit:
Beiträge: 15
Herkunft: Holzwickede, NRW

Themenstarter:

beantworten | zitieren | melden

Ich habe jetzt eines der Datenbank felder von Dezimal auf Intenger umgestellt. Jetzt läuft wieder alles!

Vielen Dank!
private Nachricht | Beiträge des Benutzers