Laden...

Rows aus DataTable und Datenbank löschen

Erstellt von steffen_dec vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.047 Views
S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 9 Jahren
Rows aus DataTable und Datenbank löschen

verwendetes Datenbanksystem: PostgreSQL

Hallo Zusammen,

ich habe eine datengebundene Datagridview die eine Tabelle aus der Datenbank darstellt. Alle Änderungen (New, Edit und Delete) in der Datagridview werden schon korrekt in der Datenbank gespeichert.

Nun möchte ich eine Spezial-Funktion einbauen, diese muss vorher alle Datensätze aus der Tabelle löschen und dann neue Datensätze importieren. Import funktioniert schon, allerdings funktioniert das löschen noch nicht.

DGV wird so verbunden:


private NpgsqlDataAdapter NpAdapter;
private System.Data.DataSet dset = null;
private DataTable dtCategories = null;
private BindingSource bindingSource = new BindingSource();

dset = new DataSet("categories");
NpAdapter = new NpgsqlDataAdapter();

NpAdapter.SelectCommand = new NpgsqlCommand("Select * from categories ORDER BY cat_id", conn);
NpAdapter.Fill(dset, "categories");

dtCategories = dset.Tables["categories"];
bindingSource.DataSource = dtCategories;

dgvCat.DataSource = bindingSource;


das Löschen der Datensätze:


            //Alle vorher löschen
            dtCategories.Rows.Clear();
            bindingSource.ResetBindings(false);

            NpAdapter.Update(dset, "categories");

Die DGV erscheint dann leer, allerdings sind die Daten immer noch in der Datenbank. D.h. wenn ich das Formular schließe und erneut öffne sind die alten Daten immer noch da.

Was mache ich hier falsch?
Ich habe noch keine Erfahrung was das DataBinding angeht 🤔

Natürlich könnte ich auch ein SQL-Befehl zum löschen der Datensätze an die DB absetzen, ich wollte aber mit den bereits geöffneten DataAdapter/DataTable machen.

Danke für die Hilfe!
Steffen

4.221 Beiträge seit 2005
vor 9 Jahren

Wenn Du die Daten mit dem Update auf der DB killen willst...

Falsch:

dt.Rows.Clear();

Richtig:
jeden Record auf dt.Rows mit Delete löschen...
dann nimmt der Update diese Delete-Anforderungen mit und löscht auf der DB.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 9 Jahren

Hallo Programmierhans,

vielen Dank, Dein Hinweis hat mich zur Lösung geführt:


for (int i = dtCategories.Rows.Count - 1; i >= 0; i--)
{
       dtCategories.Rows[i].Delete();
}
NpAdapter.Update(dset, "categories");

Finde ich komisch dass mit Rows.Clear nicht funktioniert

Gruß
Steffen

F
10.010 Beiträge seit 2004
vor 9 Jahren

Dann solltest du evtl mal in die Doku schauen, da steht exact drin ( genauso wie in vielen Beiträgen hierzu in diesem Forum ) warum Clear nicht macht was du denkst.

Aber du scheinst immer noch nicht verstanden zu haben wozu DataAdapter da sind und was man wie mit ADO.NET löst.
Wenn du eine Tabelle Leeren willst, dann mache das per Delete command und ExecuteNonQuery.

4.221 Beiträge seit 2005
vor 9 Jahren

@FZelle: Delete ExecuteNonQuery ist sicher die schnellere Variante... mein Post war nur eine Anmerkung auf diesen spezifischen Satz:

Natürlich könnte ich auch ein SQL-Befehl zum löschen der Datensätze an die DB absetzen, ich wollte aber mit den bereits geöffneten DataAdapter/DataTable machen.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...