Hallo,
ich habe beim Löschen von einträgen in meiner MS Accses DB immer folgende Fehlermeldung: > Fehlermeldung:
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.
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
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.
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
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
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.
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
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
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:> Fehlermeldung:
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.
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.
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
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Ich habe jetzt eines der Datenbank felder von Dezimal auf Intenger umgestellt. Jetzt läuft wieder alles!
Vielen Dank! 👍 🙂