Laden...

In Datenbank Daten ändern

Erstellt von larry laffer vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.921 Views
L
larry laffer Themenstarter:in
21 Beiträge seit 2006
vor 17 Jahren
In Datenbank Daten ändern

Morgen,

ich schlage mich seit gestern mittag mit Löschen einzelner Datensätze in der tatsächlichen Datenbank(MS-SQL-Server) rum.

Die Suchfunktion habe ich benutzt. Leider bin ich zu neu was VS C#(komme aus der PHP-Ecke) angeht und kann nicht genau erfassen was genau auf mich zutrifft. Desweiteren ist das Forum sehr groß und bei Suchen, wo ein paar hundert Treffer angezeigt werden, ist es sehr mühsam was rauszuholen, zumal das meiste nicht auf das Prob zutrifft(oder ich denke so).
Mir ist klar, daß man mit den richtigen Begriffen wohl zum Ziel kommt. Dazu müßte ich aber auch die zutreffenden Begriffe kennen.

Wie auch immer, das was ich per MS-Hilfe und der Suche hier gefunden und ausprobiert habe, hat mir bisher leider nicht weitergeholfen. Kommen wir zu dem Problem an sich (eigentlich wie ich es gelesen habe, nix neues).

Ich habe in einem Form eine Table draufgezogen und lasse mir alle Datensätze ausgeben. Desweiteren habe ich ein Label und einen Button. Über den Label übergebe ich mir ID des aktuellen Datensatzes und möchte mir über den Button per Click diesen Datensatz löschen.

Ich bin soweit, daß die Datensätze im Form sichtbar gelöscht werden. Mache ich die Applikation aber zu und danach wieder auf, dann ist der gelöschte Datensatz wieder da. So wie ich das verstanden habe, sind die Datensätze aus dem Dataset gelöscht, aber nicht in der Datenbank. Eigentlich dachte ich der Code würde die Aktualisierung der DB auch bewerkstelligen:


int param = Convert.ToInt32(datagridFocuslabel.Text);
dbWelsenKGDataSet.tblPersonal.FindByPersonalID(param).Delete();
this.tblPersonalTableAdapter.Update(this.dbWelsenKGDataSet.tblPersonal);

Leider krieg ich nicht mal eine Fehlermeldung. Also keine Ahnung wo ich ansetzen muß.???

So wie ich gemerkt habe gibt es mehrere Wege zum Ziel.

Anfangs habe ich einen anderen Weg verfolgt um die Datensätze löschen zu können. Ich habe im Datasetdesigner mit dem Abfragegenerator eine entsprechende Abfrage ( DeleteQuery(@ar) )

DELETE FROM tblPersonal WHERE (PersonalId==@ar)

erstellt, die auch funktioniert, wenn ich sie direkt dort ausführe. Leider habe ich nirgends ein Beispiel (nur andere Wege) gefunden, wie ich diese DeleteQuery im Code des Buttons ausführe. Ein SELECT hab ich schon mal hingekriegt, aber mit DELETE kam ich nicht zurecht. Wie stellt man das an? Den Weg finde ich besser, als den ersten und würde ihn auch bevorzugen, wenn ich es hinkriegen würde.

So vielen Dank fürs zuhören/lesen und hoffe ein Bißchen Wissen bei euch abstauben zu können 🙂

E
56 Beiträge seit 2004
vor 17 Jahren

Hallo,

bei dem DELETE bist du auf dem richtigen Weg. Eigentlich musst du nur ein DELETE auf dem DBMS absetzen, um deinen gewünschten Datensatz zu löschen.

DELETE FROM tblPersonal WHERE (PersonalId==@ar)

Dieses Statement solltest du mal ändern. Und zwar in die Richtung, dass du eine Bedingung ausliest, die der Datensatz erfüllen muss, wenn er gelöscht werden soll. Diese stellst du dann mit den WHERE Bereich rein.

Also bspw.:

DELETE FROM tblPersonal WHERE P_Name = 'Bert';

Ich kenne mich mit dem MS SQL Server nicht aus, es dürfte aber soweit trotzdem funktionieren. Es werden alle Datensätze aus tblPersonal gelöscht, wo der P_Name "Bert " ist.

k00ni

L
larry laffer Themenstarter:in
21 Beiträge seit 2006
vor 17 Jahren

Original von e86
bei dem DELETE bist du auf dem richtigen Weg. Eigentlich musst du nur ein DELETE auf dem DBMS absetzen, um deinen gewünschten Datensatz zu löschen.

Das ist mir geläufig. SQL an sich ist nicht das Problem gewesen, sondern das absetzen der Anweisung. Deswegen hatte ich ja von der Lösung abgelassen.

Original von e86
Dieses Statement solltest du mal ändern. Und zwar in die Richtung, dass du eine Bedingung ausliest, die der Datensatz erfüllen muss, wenn er gelöscht werden soll. Diese stellst du dann mit den WHERE Bereich rein.

nach meinem Wissen tut meine Anweisung(...WHERE PersonalID=@ar) schon genau das.

L
larry laffer Themenstarter:in
21 Beiträge seit 2006
vor 17 Jahren

Hi,

ich hänge immernoch bei meinem Problem fest. Habe den Code zig mal angepasst und kriege das Zurückschreiben immernoch nicht hin.


this.dbWelsenKGDataSet.tblPersonal.FindByPersonalID(param).Delete();
dbWelsenKGDataSet changes = (dbWelsenKGDataSet)dbWelsenKGDataSet.GetChanges();
int numRows=tblPersonalTableAdapter.Update(changes);
MessageBox.Show("Aktualisiert wurden " + numRows + " Zeilen", "Erfolg");
this.dbWelsenKGDataSet.AcceptChanges();

Wenn ich das ausführe, dann verschwindet der entsprechende Datensatz sichtbar von meinem Form und die Messagebox attestiert mir, daß ich eine Zeile aktualisiert habe. Mache ich das Programm zu und dann wieder auf, dann ist der vermeintliche Datensatz aber wieder da.

Wo fehlt was? Was mache ich falsch? Bräuchte echt mal einen Denkanstoß.

F
10.010 Beiträge seit 2004
vor 17 Jahren
  1. AcceptChanges rufst Du nur auf, wenn Du wirklich weist was Du tust,
    ansonsten ist es meist eher schädlich als nützlich.

  2. Du brauchst nicht die changes explizit zu holen und dem adapter zu übergeben, der macht das von ganz alleine.

  3. Ist das eine MDB oder MDF Datei?
    Die werden bei jedem programmstart aus deinem Sourceverzeichnis in dein
    Anwendungsverzeichnis copiert, die daten also wieder hergestellt.

L
larry laffer Themenstarter:in
21 Beiträge seit 2006
vor 17 Jahren

Laut meinem Buch markiert Acceptchanges die Änderungen im Dataset als dauerhaft. Ich weiß, daß es mir um die Datenbank geht und nicht ums Dataset. Dachte nur so wäre es sauberer, auch wenn es nicht hilft. Tatsache ist, daß es bei meinem Problem keinen Unterschied macht, ob die letzte Zeile vorhanden ist, oder nicht.

2.
hatte ich auch schon durch. Wieder angepasst, aber wieder kein Erfolg:


this.dbWelsenKGDataSet.tblPersonal.FindByPersonalID(param).Delete();
int numRows = tblPersonalTableAdapter.Update(this.dbWelsenKGDataSet.tblPersonal);
MessageBox.Show("Aktualisiert wurden " + numRows + " Zeilen", "Erfolg");


das ist eine mdf Datei(wurde von einem Kollegen erstellt) und liegt bei mir unter eigeneDateien. Brauche ich eine mdb-Datei? Ich hab hier c#express und wenn ich eine neue Datenbankquelle anhängen möchte, dann gibt er mir nur die mdf-Endung vor.

F
10.010 Beiträge seit 2004
vor 17 Jahren

zu1.
Der DataAdapter macht schon ein AcceptChanges, deshalb brauchst Du das nicht.
Meist benutzen die Leute AcceptChanges vor dem adapter.Update, was
dann dazu führt, das keine Changes mehr vorhanden sind.

zu 2.
Das macht es ja auch nicht erfolgreicher, es ist nur schlich überflüssig 😉

zu 3)
Wenn Du eine MDF oder MDB Datei in deinem Projekt hast, wird diese bei jedem
programmstart in das Exe-Verzeichnis copiert, und dann mit der DB verbunden.
So hast Du bei jedem Start die gleiche ausgangssituation.

L
larry laffer Themenstarter:in
21 Beiträge seit 2006
vor 17 Jahren

Original von FZelle
3. Ist das eine MDB oder MDF Datei?
Die werden bei jedem programmstart aus deinem Sourceverzeichnis in dein
Anwendungsverzeichnis kopiert, die daten also wieder hergestellt.

aha, das war wohl der richtige Hinweis. Wie ich sehe funktionert es einwandfrei, wenn ich das Programm von .../bin/release/ aus 2 mal starte. Der gelöschte Datensatz bleibt gelöscht.

aber
jetzt würde mich doch interessieren woher und wann VS sich die Kopie genau holt. Holt VS beim jedem Start("Starten ohne Debuggen") eine Kopie der Datenbank oder nur einmal beim erstellen/öffnen eines Projektes.

also ich habe die DB in folgenden Verzeichnissen auf meinen System:

...\Eigene Dateien\Visual Studio 2005\Projects\Perso2\Perso2\bin\Release
...\Eigene Dateien\Visual Studio 2005\Projects\Perso2\Perso2\bin\Debug
...\Eigene Dateien\Visual Studio 2005\Projects\Perso2\Perso2
...\Eigene Dateien

Woher kommt den nun die VS-Einbindung/Kopie? Desweiteren würde mich natürlich interessieren wie Visual Studio zum aktualisieren zu zwingen ist???

L
larry laffer Themenstarter:in
21 Beiträge seit 2006
vor 17 Jahren

Original von FZelle
zu1.
Der DataAdapter macht schon ein AcceptChanges, deshalb brauchst Du das nicht.
Meist benutzen die Leute AcceptChanges vor dem adapter.Update, was
dann dazu führt, das keine Changes mehr vorhanden sind.

ok, hab's so aus dem Buch übernommen. Aber wenn ich's nicht brauche auch gut

Original von FZelle
zu 2.
Das macht es ja auch nicht erfolgreicher, es ist nur schlich überflüssig 😉

Naja gut, ich habe schon soviel rumprobiert, daß ich noch viel längeren Code hatte mit dem selben Ergebnis 🙂

Original von FZelle
zu 3)
Wenn Du eine MDF oder MDB Datei in deinem Projekt hast, wird diese bei jedem
programmstart in das Exe-Verzeichnis copiert, und dann mit der DB verbunden.
So hast Du bei jedem Start die gleiche ausgangssituation.

Ups, da hab ich garnicht gesehen, daß Du wieder gepostet hast(siehe mein Post vorher).
--> Wo genau ist dieses EXE-Verzeichnis zu finden? Und in was für eine Datei wird die DB kopiert? Eine Suche nach dem DB-Namen hat mir nämlich kein EXE-Verzeichnis rausgeschmissen.
Woher genau wird die DB in dieses EXE-Verzeichnis kopiert (siehe oben)?

Ansonsten vielen Dank für die Hilfe. War schon langsam sehr gefrustet, aber das ist wohl eigentlich normal als Anfänger 😁

F
10.010 Beiträge seit 2004
vor 17 Jahren

VS.NET nimmt die Datei, die in deinem Projekt ist.
Wenn Du da mal im Solutionexplorer auf die Datei clickst, kannst Du die Properties sehen.

Da gibt es auch ein Property "Copy to ..", mit verschiedenen Werten.