AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MySQL Query Update funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL Query Update funktioniert nicht

Ein Thema von akio87 · begonnen am 28. Okt 2015 · letzter Beitrag vom 2. Nov 2015
Antwort Antwort
Seite 2 von 3     12 3      
Perlsau
(Gast)

n/a Beiträge
 
#11

AW: MySQL Query Update funktioniert nicht

  Alt 28. Okt 2015, 21:26
Ich weiß nicht, ob das auch in MySQL geht, aber in Firebird und MsSQL mache ich das mit den leeren String-Feldern so, daß ich bereits beim Tabellenentwurf das Feld als NotNull deklariere und dann als Defaultwert '' angebe. Damit wird dann beim insert automatisch '' eingetragen, wenn das entsprechende Feld leer (null) ist. Sollte MySQL keinen Defaultwert unterstützen, kannst du den auch in der Query-Komponente angeben.
  Mit Zitat antworten Zitat
akio87

Registriert seit: 18. Mär 2010
44 Beiträge
 
Delphi XE8 Architect
 
#12

AW: MySQL Query Update funktioniert nicht

  Alt 28. Okt 2015, 21:44
ich glaub, ich weiß was Du meinst.

Ich hab das mal ein Screenshot im Anhang beigelegt.
Es ändert sich bei keiner Einstellungsvariante etwas daran, dass wenn der Wert in der DBGrid LEER ist, dass es so in die DB übertragen wird. Es bleibt der alte Wert bestehen.

Im INSERT Befehl geht es ja auch leeren Strings, aber im UPDATE nicht...
Miniaturansicht angehängter Grafiken
unbenannt.jpg  
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#13

AW: MySQL Query Update funktioniert nicht

  Alt 28. Okt 2015, 23:02
Die meisten Datenbanken – zumindest alle, die ich schonmal ausprobiert habe – führen beim Update und Insert ein Trim auf Strings (VarChar) durch. Das heißt, wenn am Anfang oder Ende des Strings ein Leerzeichen steht, wird das vor dem Eintrag in die Tabelle entfernt. Vielleicht könntest du diese Eigenschaft nutzen, indem du, wenn du beim Update den Inhalt eines VarChar-Feldes löschen willst, einfach ein Leerzeichen übergibst.

Was mir jetzt gerade beim Schreiben dieser Zeilen einfällt: Versuche doch einmal, den Leerstring, den du eintragen möchtest, zu quoten: Leerstring := QuotedStr(''); ... dasselbe solltest du auch mit einem Leerzeichen tun, das du eintragen möchtest, falls das mit dem Leerstring nicht funktioniert. Grundsätzlich müssen Strings ja gequotet werden, bevor man sie in die DB überträgt. Gilt aber nicht für die Verwendung von Parametern, soweit ich weiß ...
  Mit Zitat antworten Zitat
akio87

Registriert seit: 18. Mär 2010
44 Beiträge
 
Delphi XE8 Architect
 
#14

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 09:17
Hallo,

das QuoteStr() kenne ich, aber leider wird die Eingabe direkt in der DBGrid stattfinden und mit der Query geupdatet. Wie sollte ich das in der DQL Sprache umsetzen, wenn ich dies in die ModifySQL.Add() übergeben will? Da ich die Eingabe in der DBGrid vorher nicht in einem String lade.

Alternativ habe ich soeben fogendes gefunden:
Eine IF THEN direkt in der SQL Query... Kann ich das nicht irgendwie verwenden?

Code:
UPDATE table
SET columnB = CASE fieldA
        WHEN columnA=1 THEN 'x'
        WHEN columnA=2 THEN 'y'
        ELSE 'z'
      END
WHERE columnC = 1

Vielleicht in meinem Beispiel in etwa so:
Code:
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Clear;
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('update `' + Tabelle + '`');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('set');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Firma = :Firma,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = Case WHEN :Adress1 = '' THEN Adress1 = NULL ELSE Adress1 = :Adress1'); // <--- ODER Adress1 = TRIM(:Adress1)??
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = Case WHEN :Adress2 = '' THEN Adress2 = NULL ELSE Adress2 = :Adress2');
//Komma Reglung irgendwie mit dazu packen? :D
...
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 09:51
Die meisten Datenbanken – zumindest alle, die ich schonmal ausprobiert habe – führen beim Update und Insert ein Trim auf Strings (VarChar) durch.
Ich denke du bringst hier gehörig was durcheinander. Ein solches Verhalten eines DBMS (die im übergebenen Daten selbst zu ändern) würde zu sofortigem Deinstallieren und zu einem 10 Jahres Bann (zumindest in meiner Umgebung) führen. Zumindest für Firebird (2.1) und MySQL (5.1) gilt das von dir beschriebene Verhalten nicht.

Was mich bei der ganzen Diskussion die ganze Zeit etwas irritiert: Warum fummelst du manuell im Modify-SQL herum? Welche Komponentenlib verwendest Du denn hier?
Wenn Du ein "normales" TQUery/TUpdateSQL Gespann hast, dann sollte das Zusammenbauen der notwendigen SQLs (Zuweisung Parameter usw) von allein ablaufen.

Und warum hast du in deiner Tabelle eigentlich keinen PrimaryKey definiert? Damit sollte sich die Identifizierung des Datensatzes und damit die nicht zu überschauende WHERE Bedingung erledigen....
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#16

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 10:09
Und warum hast du in deiner Tabelle eigentlich keinen PrimaryKey definiert? Damit sollte sich die Identifizierung des Datensatzes und damit die nicht zu überschauende WHERE Bedingung erledigen....
Das hast Du falsch verstanden, das ist "security by obscurity". Stell dir vor wie simpel es wäre eine Gridzeile zu lesen und daraus ein Updatestatement zu generieren. Das könnte ja jeder verstehen.
Und eine eindeutige ID, da würde ja garantiert nur ein Datensatz geändert.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
akio87

Registriert seit: 18. Mär 2010
44 Beiträge
 
Delphi XE8 Architect
 
#17

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 10:16
Die verwendete TMySQLUpdateSQL Komponente kann ich so nicht nutzen.

Der Aufbau erfolgt über eine DBGrid mit zwei Tabellen (Rechnungsadressen und Lieferadressen), welche ich im Vorfeld wärhrend der Laufzeit festlege, welche ich nun verwalten will. Also muss ich das Quellcode bezogen definieren und nicht in der Komoponente festlegen, da dort eine Feste Tabelle angegeben werden muss.

Ich bräuchte also eine Lösung, wie angesprochen. Wäre den die IF Then Variante ein Ansatz und wie schreibt man das richtig in einem SQL Query Befehl um?
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#18

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 10:18
Und warum hast du in deiner Tabelle eigentlich keinen PrimaryKey definiert? Damit sollte sich die Identifizierung des Datensatzes und damit die nicht zu überschauende WHERE Bedingung erledigen....
Das hast Du falsch verstanden, das ist "security by obscurity". Stell dir vor wie simpel es wäre eine Gridzeile zu lesen und daraus ein Updatestatement zu generieren. Das könnte ja jeder verstehen.

aha... ich seh schon. ich bin für die realen Probleme diese Welt zu einfach gestrickt....
oder
Zitat:
Ich bin zu alt für diesen Scheiß...
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 10:30
Der Aufbau erfolgt über eine DBGrid mit zwei Tabellen (Rechnungsadressen und Lieferadressen), welche ich im Vorfeld wärhrend der Laufzeit festlege, welche ich nun verwalten will.
Warum dann nicht 2 Queries, 2 UpdateSQL, 2 DataSources und zur Laufzeit änderst Du lediglich die Datasource-Eigenschaft des Grids?
  Mit Zitat antworten Zitat
akio87

Registriert seit: 18. Mär 2010
44 Beiträge
 
Delphi XE8 Architect
 
#20

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 11:40
die Umstellung zieht ein Rattenschwanz mit sich - ich seh das schon kommen..

Ich teste die funktionalität mit einer DBGrid und lass die TmySQLUpdateSQL ihren eigenen Job erledigen.
Mal schauen, ob er die Null/Leer Strings in der DBGrid-Zelle erfolgreich in die DB speichert...

Wenn das auch nicht funktioniert, find ich den Ansatz mit der WHEN THEN immernoch als gute alternative, wenn man es richtig umsetzten kann. Ob die Schreibweise so richtig ist, teste ich dann ebenfalls.
Code:
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = Case WHEN :Adress1 = '' THEN Adress1 = NULL ELSE Adress1 = :Adress1'); // <--- ODER Adress1 = TRIM(:Adress1)??
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = Case WHEN :Adress2 = '' THEN Adress2 = NULL ELSE Adress2 = :Adress2');
Erst einmal vielen Dank an Alle. Bis heute Abend.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 10:36 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