Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Query Update funktioniert nicht (https://www.delphipraxis.net/187114-mysql-query-update-funktioniert-nicht.html)

Perlsau 28. Okt 2015 20:26

AW: MySQL Query Update funktioniert nicht
 
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.

akio87 28. Okt 2015 20:44

AW: MySQL Query Update funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
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...

Perlsau 28. Okt 2015 22:02

AW: MySQL Query Update funktioniert nicht
 
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:
Delphi-Quellcode:
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ß ...

akio87 29. Okt 2015 08:17

AW: MySQL Query Update funktioniert nicht
 
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
...

Lemmy 29. Okt 2015 08:51

AW: MySQL Query Update funktioniert nicht
 
Zitat:

Zitat von Perlsau (Beitrag 1320044)
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....

p80286 29. Okt 2015 09:09

AW: MySQL Query Update funktioniert nicht
 
Zitat:

Zitat von Lemmy (Beitrag 1320073)
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

akio87 29. Okt 2015 09:16

AW: MySQL Query Update funktioniert nicht
 
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?

Lemmy 29. Okt 2015 09:18

AW: MySQL Query Update funktioniert nicht
 
Zitat:

Zitat von p80286 (Beitrag 1320077)
Zitat:

Zitat von Lemmy (Beitrag 1320073)
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ß...
;-)

Lemmy 29. Okt 2015 09:30

AW: MySQL Query Update funktioniert nicht
 
Zitat:

Zitat von akio87 (Beitrag 1320080)
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?

akio87 29. Okt 2015 10:40

AW: MySQL Query Update funktioniert nicht
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr.
Seite 2 von 3     12 3      

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