Datensatz löschen

Für Fragen von Einsteigern und Programmieranfängern...
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Datensatz löschen

Beitrag von Aliobaba »

Hallo,

Warum läßt sich der angewählte Datensatz nicht löschen????
(Die auskommentierten Zeilen ist ein Teil meiner Versuche am heutigen Tag :cry: )
Vielleicht kann mir jemand einen kleinen entscheidenden Hinweis geben

Danke!!

Aliobaba

P.S.: mit dem "Update" Befehl hatte ich ebenfalls ähnliche Probleme -- aber jetzt erstmal zum Löschen

<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Code: Alles auswählen

procedure TForm1.LoeschenClick(Sender: TObject);
 begin
 Label5.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
 
// ZQuery1.SQL.Text:='DELETE FROM `tabelle1` WHERE  ( Column1 = " ' + DBEdit1.text + ' " )';
 
with ZQuery1 do
 begin
   SQL.Clear;
  //  SQL.add ( 'DELETE FROM `tabelle1` WHERE  ( Column1 = " ' + DBEdit1.text + ' " )');
   sql.Text := 'DELETE FROM `tabelle1` WHERE  Column1= :col1 LIMIT 1 ';
  //  Params.ParamValues['Col1'] := DBEdit1.Text;
   ParamByName('Col1').AsString := DBEdit1.Text;
  //  ApplyUpdates;
    ExecSQL;
 end;
 
 ZQuery1.SQL.Text := Memo1.Lines.Text;  // alle Daten in der DBGrid nochmal anzeigen
 ZQuery1.Open;
 
end;
<<<<<<<<<<<<<<<<<<

Das sind verschiedene SQL-Strings, die von "HeidiSQL" generiert werden:
// UPDATE `tabelle1` SET `Column2`='AY71644' WHERE `Column1`='X30174' AND `Column2`='Y71644' AND `Column3`='66036' AND `Column4`='Z52791' LIMIT 1;
// UPDATE `tabelle1` SET `Column1`='AX51926' WHERE `Column1`='X51926' AND `Column2`='Y89348' AND `Column3`='58021' AND `Column4`='Z64922' LIMIT 1;
// DELETE FROM `tabelle1` WHERE `Column1`='X41851' AND `Column2`='Y48946' AND `Column3`='66813' AND `Column4`='Z15794' LIMIT 1;
// INSERT INTO `tabelle1` (`Column1`, `Column2`, `Column3`, `Column4`) VALUES ('X76344', 'Y79691', '72999', 'Z94488');
// SELECT `Column1`, `Column2`, `Column3`, `Column4` FROM `test`.`tabelle1` LIMIT 1000;
// DELETE FROM `tabelle1` WHERE `Column1`='X14076' AND `Column2`='Y33117' AND `Column3`='57467' AND `Column4`='Z98957' LIMIT 1;
Zuletzt geändert von Lori am Sa 19. Mai 2012, 10:50, insgesamt 1-mal geändert.
Grund: Highlighter
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Ich bin mir jetzt nicht sicher, ob der Parameter Col1 Casesensitive ist.

Ansonsten was kommt denn für eine Fehlermeldung? MySQL sagt da schon ziemlich genau wo es klemmt.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

Hallo MmVisual,

es kommt keine Fehlermeldung: aber es wird schlicht nichts gelöscht :oops:

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Datensatz löschen

Beitrag von Antrepolit »

Was soll denn das LIMIT 1 bei einer DELETE oder UPDATEAnweisung? Das hat da nichts zu suchen.
Grüße, Antrepolit

care only if your os is really burning

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

Hallo,
diese LIMIT Anweisungen generiert das Programm 'HeidiSQL' bei den Abfragen und ich habe mich an diese SQL-Statements angelehnt bei meinem Versuch, diese in 'mein' Lazarus-Programm einzubauen.:
z.B.:
// DELETE FROM `tabelle1` WHERE `Column1`='X41851' AND `Column2`='Y48946' AND `Column3`='66813' AND `Column4`='Z15794' LIMIT 1;
// SELECT `Column1`, `Column2`, `Column3`, `Column4` FROM `test`.`tabelle1` LIMIT 1000;

Ich vermute, das ist die Zahl der maximal zu löschenden ( anzuzeigenden) Datensätze.
Aber ich habe soeben versuchsweise mal diese 'LIMIT'-Anweisungen aus dem Quellcode rausgenommen: Das Löschen funktioniert weiterhin nicht, obwohl kein Fehler gemeldet wird.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Datensatz löschen

Beitrag von Antrepolit »

Beim löschen macht Limit keinen Sinn. Ein Datensatz, der gleöscht wird, sollte einmalig identifizierbar sein. Womöglich hast du mehrere identische Datensätze, so dass immer einer gelöscht wird, du es aber nicht siehst?
Grüße, Antrepolit

care only if your os is really burning

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Setze doch mal den TZSQLMonitor mit auf das Formular und schreibe das was im Event "OnLogTrace" an kommt in eine TListBox. Damit kannst DU sehen was für SQL Befehle tatsächlich an die Datenbank geschickt werden.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

Hallo,

Danke für die Hinweise!

@Antrepolit: doppelte Datensätze gibt es ganz sicher nicht

@MmVisual: den TZSQLMonitor habe ich auf der 'Form1' Platziert -> Active und AutosaveTrue;
Was muß in 'Filename' rein? Evtl. ein Log-File? In den Projekt Ordner wird beim Ausführen des Programm vom TZSQLMonitor und des besagten Lösch-Befehls nichts reingeschrieben [auch nicht, wenn 'funktionierende SQL-Statements an die Datenbank geschickt werden], wenn ich hier einen beliebigen file-Namen angebe; auch nicht wenn ich z.B. das File 'Monitor.txt' erstelle und den Pfad dorthin verlege.

Nochmal @MmVisual: zu Casesensitiv: Column1 habe ich nur deshalb zu Col1 umbenannt, um besser erkennen zu können was die Variable ist und was der Name für die Datensatzspalte; aber auch mit Column1 funktioniert es nicht.

Aliobaba

Mein Programm als Anhang:
Dateianhänge
testdp_export Mysql.zip
Mein Programm (Aber bitte nicht lachen, bin Anfänger!)
(6.05 KiB) 62-mal heruntergeladen
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Ich habe die Kompo noch nie mit einer Datei genutzt, nur mit "OnLogTrace" und selbst in eine TListBox geloggt.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Ich denke ich weiß woran das liegt:

Code: Alles auswählen

with ZQuery1 do
 begin
   SQL.Clear;
   sql.Text := 'DELETE FROM `tabelle1` WHERE  Column1= :col1 ';
   ParamByName('col1').AsString := DBEdit1.Text;   <<<<<<<<<<<<<<<<<<<<<
    ExecSQL;
 end;
- das SQL.Clear schließt die Query
- Damit steht in DBEdit1.Text nix mehr drin
- damit ist der SQL-Befehl, der ausgeführt wird: DELETE FROM `tabelle1` WHERE Column1= ""

Also mache das rein:

Code: Alles auswählen

procedure TForm1.ZSQLMonitor1LogTrace(Sender: TObject; Event: TZLoggingEvent);
begin
  Listbox1.AddItem(Event.AsString);
end;
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

Hallo MmVisual,

das Löschen/Auskommentieren von SQL.Clear hat leider nichts gebracht.
Ich glaube, Lazarus mag mich nicht :? ,denn auch das Hinzufügen des von Dir vorgeschlagenen codes (Listbox) :

Code: Alles auswählen

procedure TForm1.ZSQLMonitor1LogTrace(Sender: TObject; Event: TZLoggingEvent);
begin
  Listbox1.AddItem(event.AsString);
end;
bringt schon wieder eine Fehlermeldung:

laztest2.pas(111,35) Error: Wrong number of parameters specified for call to "AddItem"
customlistbox.inc(556,26) Hint: Found declaration: TCustomListBox.AddItem(const AnsiString,TObject);
laztest2.pas(565) Fatal: There were 1 errors compiling module, stopping

Ich sollte vielleicht doch lieber bei den grundrechenarten bleiben :roll:
(Du bist aber schon früh wach :?: , MmVisual)

Viele Grüße
Aliobaba
Zuletzt geändert von Lori am Sa 19. Mai 2012, 10:51, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter verwenden
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

.... aber Dein Hinweis ist eine ganz heiße Spur!

wenn ich nämlich diese Zeile:

Code: Alles auswählen

Label5.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
unmittelbar hinter das SQL-Statement setze:

Code: Alles auswählen

begin
with ZQuery1 do
 begin
   sql.Text := 'DELETE FROM `tabelle1` WHERE  Column1= :col1 ';
   ParamByName('Col1').AsString := DBEdit1.Text;
    ExecSQL;
 end;
Label5.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
dann ist der String leer!
er erscheint nur deshalb wieder gefüllt weil das folgt:

Code: Alles auswählen

ZQuery1.SQL.Text := Memo1.Lines.Text;  // alle Daten in der DBGrid nochmal anzeigen
ZQuery1.Open;
Aliobaba

Nachtrag:

Code: Alles auswählen

procedure TForm1.LoeschenClick(Sender: TObject);
begin
Label6.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
with ZQuery1 do
 begin
   sql.Text := 'DELETE FROM `tabelle1` WHERE  Column1= :col1 ';
   ParamByName('Col1').AsString := DBEdit1.Text;
    ExecSQL;
 end;
Label7.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
bei Label6.Caption ist der DBEdit1.Text noch mit Inhalt,
bei Label7.Caption ist der Text leer.
Zuletzt geändert von Lori am Sa 19. Mai 2012, 10:53, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter verwenden
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Datensatz löschen

Beitrag von Christian »

Beim löschen macht limit durchaus einen sinn stell dir vor die primary key select ist aus irgend nem grund falsch. Dann kann plötzlich die tabelle leer sein. Ist ne reine sicherheitsgeschichte
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

> bei Label6.Caption ist der DBEdit1.Text noch mit Inhalt,
> bei Label7.Caption ist der Text leer.

Genau das meinte ich ;-)

SQL.Text := ....

macht die Query dicht, zu, schließt, >>>> keine Daten mehr in DBEdit1 ...
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Datensatz löschen

Beitrag von Antrepolit »

Christian hat geschrieben:Beim löschen macht limit durchaus einen sinn stell dir vor die primary key select ist aus irgend nem grund falsch. Dann kann plötzlich die tabelle leer sein. Ist ne reine sicherheitsgeschichte
Ok, derartige Probleme hatte ich bisher nicht. Aber auch mit Limit kann man nicht bestimmen, welcher Datensatz mit mehrfachem PK nun gelöscht wird. By the way - wenn man eine PK-Constraint verwendet, wie kann es da zu doppelten Einträgen kommen? Der PK ist doch zwingend unique.

Code: Alles auswählen

procedure TForm1.LoeschenClick(Sender: TObject);
begin
Label6.Caption:= DBEdit1.Text; // Zur Kontrolle, ob der richtige String angewählt ist
with ZQuery1 do
begin
sql.Text := 'DELETE FROM `tabelle1` WHERE Column1= :col1 ';
ParamByName('Col1').AsString := DBEdit1.Text;
ExecSQL;
end;
Label7.Caption:= DBEdit1.Text; // Zur Kontrolle, ob der richtige String angewählt ist
Was bitteschön soll eigentlich die rote Stelle? Ein TDBEdit wird mit einer Datasource verbunden und zeigt den INHALT der eines Attributs der Tabelle an. Übergib' an der Stelle mal den Wert eines normalen TEdit. Verwende also einen normalen TEdit da du ja gar nicht weißt, was mit dem Datenbank-Cursor passiert, wenn ExecSQL ausgeführt wird und du "keinen" Effekt siehst.
Zuletzt geändert von Lori am Sa 19. Mai 2012, 10:53, insgesamt 1-mal geändert.
Grund: Highlighter
Grüße, Antrepolit

care only if your os is really burning

Antworten