Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datensatz wird nicht gelöscht (https://www.delphipraxis.net/211824-datensatz-wird-nicht-geloescht.html)

juelin 7. Nov 2022 22:57

Datenbank: MySQL • Version: MariaDB • Zugriff über: MyDAC

Datensatz wird nicht gelöscht
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich bin am verzweifeln.
Ich habe Windows 10
RAD-Studio Delphi 10.4 Community Version
MyDAC devart MySQL data access componets Version 11.2
Ich habe ein Programm geschrieben, in dem ich u.a. einen Datensatz aus der Datenbank logbuch und Tabelle logbuch löschen möchte.
Delphi-Quellcode:
            Form1.MyCommand1.SQL.Clear;
            Form1.MyCommand1.SQL.Add('DELETE FROM logbuch WHERE Rufzeichen1=:ru1 AND Rufzeichen2=:ru2 AND Rufzeichen3=:ru3 AND Datumvon=:dav AND Uhrzeitvon=:urv');
            Form1.MyCommand1.ParamByName('ru1').Name:='ru1';
            Form1.MyCommand1.ParamByName('ru1').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru1').Value:=e9ruf1;
            Form1.MyCommand1.ParamByName('ru2').Name:='ru2';
            Form1.MyCommand1.ParamByName('ru2').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru2').Value:=e9ruf2;
            Form1.MyCommand1.ParamByName('ru3').Name:='ru3';
            Form1.MyCommand1.ParamByName('ru3').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru3').Value:=e9ruf3;
            Form1.MyCommand1.ParamByName('dav').Name:='dav';
            Form1.MyCommand1.ParamByName('dav').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('dav').Value:=e9vdat;
            Form1.MyCommand1.ParamByName('urv').Name:='urv';
            Form1.MyCommand1.ParamByName('urv').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('urv').Value:=e9vzeit;
            Form1.MyCommand1.Execute;
            if not SqlRet then
Das Feld e9ruf1 Typ varchar enthält ''
Das Feld e9ruf2 Typ varchar enthält 'DB3GK'
Das Feld e9ruf3 Typ varchar enthält ''
Das Feld e9vdat Typ TDate enthält '07.11.2022'
Das Feld e9vzeit Typ TTime enthält '22:35:00'
Nach Form1.MyCommand1.Execute enthält der SqlRet Typ Boolean den Wert True
der Datensatz ist aber nicht gelöscht.
(siehe Anlagen)

Kann mir da jemand Helften?

Danke und Gruß
Jürgen

knuut21 8. Nov 2022 04:38

AW: Datensatz wird nicht gelöscht
 
Moin Juelin,

bist Du sicher, dass der Typ des Parameter urv korrekt ist? Lt. dem Screenshot ist es "nur" die Uhrzeit, sollte also eher vom Typ ftTime sein.

Falls die Tabelle einen PK besitzt, solltest Du für das Löschen dann besser diesen nutzen, da hierdurch die Eindeutigkeit gewährleistet ist und Du nicht "aus Versehen" ggf. auch noch andere Datensätze löscht, welche die Kriterien erfüllen.

BG

knuut21

hoika 8. Nov 2022 05:38

AW: Datensatz wird nicht gelöscht
 
Hallo,
laß mal Datum und Uhrzeit weg.

Sinspin 8. Nov 2022 05:43

AW: Datensatz wird nicht gelöscht
 
Hey,

Suchen oder gar Löschen via Timestamps oder Datum+Zeitwerten sollte man sich wirklich genau überlegen. Das wird im schlimmstenfall unscharf und betrifft mehr als einen Datensatz. ...oder gar keinen, wie bei dir ;-)
Deine Tabelle(n) sollte(n) einen einfachen eindeutigen Index besitzen. Am besten eignet sich ein Integer mit AutoInc Eigenschaft.
So ist jeder Datensatz dann garantiert eindeutig identifizierbar.

TigerLilly 8. Nov 2022 06:33

AW: Datensatz wird nicht gelöscht
 
Bei solchen Problemen mache ich aus dem Delete immer ein Select + schau, ob der gewünschte Datensatz überhaupt gefunden wird.

Jasocul 8. Nov 2022 06:34

AW: Datensatz wird nicht gelöscht
 
Zitat:

Zitat von juelin (Beitrag 1514456)
Delphi-Quellcode:
            Form1.MyCommand1.SQL.Clear;
            Form1.MyCommand1.SQL.Add('DELETE FROM logbuch WHERE Rufzeichen1=:ru1 AND Rufzeichen2=:ru2 AND Rufzeichen3=:ru3 AND Datumvon=:dav AND Uhrzeitvon=:urv');
            Form1.MyCommand1.ParamByName('ru1').Name:='ru1';
            Form1.MyCommand1.ParamByName('ru1').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru1').Value:=e9ruf1;
            Form1.MyCommand1.ParamByName('ru2').Name:='ru2';
            Form1.MyCommand1.ParamByName('ru2').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru2').Value:=e9ruf2;
            Form1.MyCommand1.ParamByName('ru3').Name:='ru3';
            Form1.MyCommand1.ParamByName('ru3').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru3').Value:=e9ruf3;
            Form1.MyCommand1.ParamByName('dav').Name:='dav';
            Form1.MyCommand1.ParamByName('dav').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('dav').Value:=e9vdat;
            Form1.MyCommand1.ParamByName('urv').Name:='urv';
            Form1.MyCommand1.ParamByName('urv').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('urv').Value:=e9vzeit;
            Form1.MyCommand1.Execute;
            if not SqlRet then

Erstmal den Delphi-Code ändern:
Delphi-Quellcode:
            Form1.MyCommand1.SQL.Clear;
            Form1.MyCommand1.SQL.Add('DELETE FROM logbuch WHERE Rufzeichen1=:ru1 AND Rufzeichen2=:ru2 AND Rufzeichen3=:ru3 AND Datumvon=:dav AND Uhrzeitvon=:urv');
            Form1.MyCommand1.ParamByName('ru1').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru1').AsString:=e9ruf1;
            Form1.MyCommand1.ParamByName('ru2').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru2').AsString:=e9ruf2;
            Form1.MyCommand1.ParamByName('ru3').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru3').AsString:=e9ruf3;
            Form1.MyCommand1.ParamByName('dav').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('dav').AsDateTime:=e9vdat;
            Form1.MyCommand1.ParamByName('urv').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('urv').AsDateTime:=e9vzeit;
            Form1.MyCommand1.Execute;
            if not SqlRet then
Eine Namenszuweisung auf einen Parameter, den du schon mit dem Namen ansprichst, ist nicht nötig.
Die Wertzuweisung auf ParamByName('...').Value sollte man vermeiden, wenn man den Typ bereits kennt. Das bremst die Performance und kann in seltenen Fällen zu falschen Umwandlungen führen.
Den Type deiner Variablen kenne ich nicht. Gegebenenfalls musst du die noch umwandeln.

Die Probleme mit DateTime und Time wurden bereits angedeutet. Warum kann das ein Problem sein? Eim Time-Feld in der DB wird evtl. anders verwaltet, als ein DateTime-Feld. Möglicherweise werden Millisekunden mit abgespeichert, aber deine Zuweisung ist nur sekundengenau. Wird in der DB vielleicht ein anderes Datumsformat genutzt?

Mache aus deinen Delete erstmal ein Select. Teste es auf einem DB-Frontend. Dann siehst du vielleicht schon, ob du überhaupt den Datensatz findest. Teste das gegebenenfalls noch mit einem entsprechenden Select (das auch eine Ergebnis liefert) in Delphi und schaue dir dort die Feldinhalte an (FieldByName mit AsString, bzw. AsDateTime).

haentschman 8. Nov 2022 07:05

AW: Datensatz wird nicht gelöscht
 
Moin...8-)
Zitat:

Eine Namenszuweisung auf einen Parameter, den du schon mit dem Namen ansprichst, ist nicht nötig.
1. Auch eine DataTyp Zuweisung ist nicht nötig.
2. Ein SQL.CLEAR ist nur bei Verwendung von ADD nötig. Bei Verwendung von SQL.TEXT nicht.
3. Form1 ist :kotz: ...sprechende Namen mit Präfix sind kein Luxus mehr. :wink:

Delphi-Quellcode:
foBlubb.qryCommand.SQL.Text := 'DELETE FROM logbuch WHERE Rufzeichen1=:ru1 AND Rufzeichen2=:ru2 AND Rufzeichen3=:ru3 AND Datumvon=:dav AND Uhrzeitvon=:urv';
foBlubb.qryCommand.ParamByName('ru1').AsString := e9ruf1;
foBlubb.qryCommand.ParamByName('ru2').AsString := e9ruf2;
foBlubb.qryCommand.ParamByName('ru3').AsString := e9ruf3;
foBlubb.qryCommand.ParamByName('dav').AsDateTime := e9vdat;
foBlubb.qryCommand.ParamByName('urv').AsDateTime := e9vzeit;
foBlubb.qryCommand.Execute;
PS: Ich würde den "Zeitstempel" in einem Feld speichern. Ggf. in der Oberfläche optisch trennen.

:wink:

taveuni 8. Nov 2022 07:28

AW: Datensatz wird nicht gelöscht
 
Zitat:

Zitat von juelin (Beitrag 1514456)

(..)

Delphi-Quellcode:
            Form1.MyCommand1.SQL.Clear;
            Form1.MyCommand1.SQL.Add('DELETE FROM logbuch WHERE Rufzeichen1=:ru1 AND Rufzeichen2=:ru2 AND Rufzeichen3=:ru3 AND Datumvon=:dav AND Uhrzeitvon=:urv');
            Form1.MyCommand1.ParamByName('ru1').Name:='ru1';
            Form1.MyCommand1.ParamByName('ru1').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru1').Value:=e9ruf1;
            Form1.MyCommand1.ParamByName('ru2').Name:='ru2';
            Form1.MyCommand1.ParamByName('ru2').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru2').Value:=e9ruf2;
            Form1.MyCommand1.ParamByName('ru3').Name:='ru3';
            Form1.MyCommand1.ParamByName('ru3').DataType:=ftString;
            Form1.MyCommand1.ParamByName('ru3').Value:=e9ruf3;
            Form1.MyCommand1.ParamByName('dav').Name:='dav';
            Form1.MyCommand1.ParamByName('dav').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('dav').Value:=e9vdat;
            Form1.MyCommand1.ParamByName('urv').Name:='urv';
            Form1.MyCommand1.ParamByName('urv').DataType:=ftDateTime;
            Form1.MyCommand1.ParamByName('urv').Value:=e9vzeit;
            Form1.MyCommand1.Execute;
            if not SqlRet then
(..)

Kann mir da jemand Helften?

Ersetze einfach mal das "DELETE" durch "SELECT *" deines Statements. So lange bis Du den gewünschten Datensatz erhältst. Dann kannst Du diesen auch löschen.

himitsu 8. Nov 2022 08:46

AW: Datensatz wird nicht gelöscht
 
Zitat:

Das Feld e9ruf1 Typ varchar enthält ''
Wirklich '' oder nicht vielleicht doch NULL?

juelin 8. Nov 2022 11:20

AW: Datensatz wird nicht gelöscht
 
Danke für die Hilfe.
Habe den Datentyp von FtDateTime auf DtTime für das Datenfeld e9vzeit geändert.
Siehe da es läuft.
Danke und Gruß
Jürgen


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz