AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Datensatz wird nicht gelöscht
Thema durchsuchen
Ansicht
Themen-Optionen

Datensatz wird nicht gelöscht

Ein Thema von juelin · begonnen am 7. Nov 2022 · letzter Beitrag vom 8. Nov 2022
Antwort Antwort
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#1

Datensatz wird nicht gelöscht

  Alt 7. Nov 2022, 23:57
Datenbank: MySQL • Version: MariaDB • Zugriff über: MyDAC
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
Miniaturansicht angehängter Grafiken
datensaetze.jpg  
Angehängte Dateien
Dateityp: pdf logbuch.pdf (210,4 KB, 6x aufgerufen)
Jürgen Linder

Geändert von juelin ( 8. Nov 2022 um 00:00 Uhr)
  Mit Zitat antworten Zitat
knuut21

Registriert seit: 3. Mär 2010
Ort: Unna
21 Beiträge
 
RAD-Studio 2010 Ent
 
#2

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 05:38
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 06:38
Hallo,
laß mal Datum und Uhrzeit weg.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 06:43
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 07:33
Bei solchen Problemen mache ich aus dem Delete immer ein Select + schau, ob der gewünschte Datensatz überhaupt gefunden wird.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 07:34
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).
Peter
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 08:05
Moin...
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 ...sprechende Namen mit Präfix sind kein Luxus mehr.

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.


Geändert von haentschman ( 8. Nov 2022 um 08:10 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 08:28

(..)

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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#9

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 09:46
Zitat:
Das Feld e9ruf1 Typ varchar enthält ''
Wirklich '' oder nicht vielleicht doch NULL?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#10

AW: Datensatz wird nicht gelöscht

  Alt 8. Nov 2022, 12:20
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
Jürgen Linder
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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