![]() |
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:
Das Feld e9ruf1 Typ varchar enthält ''
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 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 |
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 |
AW: Datensatz wird nicht gelöscht
Hallo,
laß mal Datum und Uhrzeit weg. |
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. |
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.
|
AW: Datensatz wird nicht gelöscht
Zitat:
Delphi-Quellcode:
Eine Namenszuweisung auf einen Parameter, den du schon mit dem Namen ansprichst, ist nicht nötig.
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 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). |
AW: Datensatz wird nicht gelöscht
Moin...8-)
Zitat:
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:
PS: Ich würde den "Zeitstempel" in einem Feld speichern. Ggf. in der Oberfläche optisch trennen.
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; :wink: |
AW: Datensatz wird nicht gelöscht
Zitat:
|
AW: Datensatz wird nicht gelöscht
Zitat:
|
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 07:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz