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 1 von 2  1 2      
Perlsau
(Gast)

n/a Beiträge
 
#1

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
 
#2

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.387 Beiträge
 
Delphi 10.4 Sydney
 
#3

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
 
#4

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
 
#5

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.387 Beiträge
 
Delphi 10.4 Sydney
 
#6

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
 
#7

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
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.387 Beiträge
 
Delphi 10.4 Sydney
 
#8

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
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 12:22
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.
Hab's gerade eben nochmal getestet:
  • In einer Anwendung in einem DBEdit, das auf ein VarChar-Feld verweist, ein Leerzeichen am Ende des Strings angefügt: Leerzeichen bleibt erhalten.
  • Im IbExpert in derselben DB im selben Record und derselben Spalte ein Leerzeichen ans Ende des Strings gesetzt: Leerzeichen wird beim Posten entfernt.

Da hab ich also in der Tat was durcheinandergebracht, nehme alles zurück und behaupte das Gegenteil
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.387 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: MySQL Query Update funktioniert nicht

  Alt 29. Okt 2015, 12:54
  • Im IbExpert in derselben DB im selben Record und derselben Spalte ein Leerzeichen ans Ende des Strings gesetzt: Leerzeichen wird beim Posten entfernt.
Das ist aber ein Problem von IBExpert und nicht von Firebird: Das Leerzeichen wird lediglich in der Gridanzeige entfernt! In der Datenbank bleibt das weiterhin enthalten.
Beispiel: Steht " das " in der Spalte, wird char_length korrekt mit 5 ermittelt, in der Grid-Anzeige fehlt aber das letzte Leerzeichen. Hänge ich nun weitere Leerzeichen per IBExpert-Grid ran, dann bleibt das so bei den 5. Ändere ich das per Update SQL, wird der Text so abgespeichert wie ich will und nicht wie IBExpert meint dass es sein müsste... und es ändert sich auch die String-Länge (Hinweis IBExpert 2015.1.11.1)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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