AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi xe2 und #39 =ZWEI Hochkommas
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi xe2 und #39 =ZWEI Hochkommas

Ein Thema von Ykcim · begonnen am 17. Sep 2012 · letzter Beitrag vom 8. Okt 2012
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#21

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 5. Okt 2012, 16:34
QuotedStr ist eine Funktion, die hat mit Komponenten nichts zu tun und ist weiter vorn sogar verlinkt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 5. Okt 2012, 16:43
diese Funktion gib's seit Delphi7 (man muß nur den richtigen Zeichensatz erwischen (Ansi,Unicode)
Zitat:
Unit

SysUtils

Kategorie

String-Verarbeitung

Delphi-Syntax:

function QuotedStr(const S: string): string;

C++ Syntax:

extern PACKAGE AnsiString __fastcall QuotedStr(const AnsiString S);

Beschreibung

Mit QuotedStr kann der String S in einen String in Anführungszeichen umgewandelt werden. Am Anfang und am Ende von S wird ein halbes Anführungszeichen (') hinzugefügt. Wenn innerhalb des Strings halbe Anführungszeichen enthalten sind, werden diese verdoppelt.

Hinweis: Verwenden Sie für die Arbeit mit Multibyte-Zeichensätzen (MBCS) stattdessen die Funktion AnsiQuotedStr.
Schau mal in Deine OnlineHilfe, was Du da findest.

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

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

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 5. Okt 2012, 16:48
Zitat:
Ich habe in der Liste der überwachten Objekte festgestellt, dass #39='' statt '
Da hast du etwas falsch geguckt.
Im String ist nur ein ' enthalten, aber es wird dort so dargestellt, wie man es im Quellcode schreiben würde, also '' im String und dazu noch die beiden ' am Anfang und am Ende.

Wären dort wirklich 2 ' dann würdes du '''' sehn, also 'abc''''def' statt dem abc''def welches wirklich im string wäre.
Wie gesagt, die "Darstellung" dessen wurde überarbeitet, was sich wirklich im String befindet.
So werden nun auch gewisse Steuerzeichen ordentlich und vorallem "sichtbar" dargestellt, wie z.B. Tabulatoren und Zeilenumbrüche.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 5. Okt 2012, 16:51
Zitat:
diese Funktion gib's seit Delphi7 (man muß nur den richtigen Zeichensatz erwischen (Ansi,Unicode)
Eine wirklich saubere Lösung wäre aber, eine parametrisierte Abfrage zu verwenden. hierfür findest du unzählige Beispiele hier im forum und im Web bzw. hat sie Frank schon gepostet
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 5. Okt 2012, 16:52
Ich habe in der Liste der überwachten Objekte festgestellt, dass #39='' statt ' ergibt. Ob das jetzt der Wahrheit entspricht, weiß ich nicht. Ich habe eine Screenshot angehängt, auf dem Ihr es sehen könnt.
Das die Textdarstellung etwas gewöhnungsbedürftig ist hat sich noch nicht bis zu Embacadingsbums herum gesprochen. (Proportional-Font bei einer Programmieroberfläche brrr)

Aus Deinen Screenshot leite ich hingegen ab, daß Du vollkommen unproblematisch mit Parametern arbeiten könntest.

Gruß
K-H

och mann alle sind schneller als ich

Edith2:
Das "ohne Komponenten" halte ich für ein Gerücht, Zeig doch einmal Deine Uses her.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 5. Okt 2012 um 16:59 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#26

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 5. Okt 2012, 21:01
Jede Datenbank reagiert anders. Nun dreht es sich hier um MySQL. Ok kleinens tutorial, Männers.

Ihr könnt weder x ' zu euren Strings hinzufügen noch diese weglassen, es sei den es sind soganante Identifier.

Zurück zum Thema:

Du willst das ' oder mehrere ' ein einem String speichern und das nicht via Parameter sondern in einer selbst assemblierten Abfrage.

prinzipiel kannst du einen String nur mit #39+String+#39 versehen ABER alle dazwischen liegenden #39 MUSST du ESCAPEN. Sonst kommt MySQL beim splitten deiner Query mit den Tokens durcheinander. MySQL bietet dafür functionen an, die das für dich tun und du mußt nur noch den #39 drumherum setzen. Zeos bietet hierfür die function EscapeString(Value: String): String an. Falls du jedoch die möglichkeit hast direkt mit deiner libmysql zu arbeiten, sollte dir die function mysql_escape_string(PTo, PFrom: PAnsiChar; Len: ULong): ULong; weiterhelfen.

Das problem, welches du hier anschneidest ist weitaus größer als du denkst. Alle diese Datenbanken haben ein unterschiedliches Escaping verhalten mit den jeweils unterschiedlichen CharacterSets. Den Vogel schießt da meines Erachtens nach PostgreSQL ab.

Also grundsätlich HÄNDE weg von AnsiQuotedStr oder QuotedStr! Was die Pascal Compiler verstehen heist NICHT das es die Datenbank versteht.

Nächstes Problem wäre zum Beispiel dieser String '''abc\''abc''', da nun auch der Backslash beim escapen eine enorme Rolle spielt

Fazit: Solltest du explizit nicht wissen, was in deinem String enthalten ist, laß die Datenbank das escapen übernehmen, was Parameterisierte Queries automatisch für dich tun.

dein #39Test#39 String müßte (hoffe das ist jetzt vollkommen richtig) also wie folgt behandelt werden:
select * from tabelle1 where feld1='#39+'\'+#39+'text+'\'+#39+#39 quasi OHNE Pascal Quotes '\'text\''

Wenn das nun alles zu kompliziert wird: Benutze Paramter!

Michael
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#27

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 7. Okt 2012, 10:14
Also nach dem ich mir mal diese mysql.pas angesehen habe kann ich ja fast nur noch mit dem Kopf schütteln.

Da gibt es doch tatsächlich Funktionen darinnen um alles mögliche zu Escapen und zu Quoten und zwar "the mysql-way"

Jetzt stellt sich nur noch die Frage, warum werden diese Funktionen nicht benutzt?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#28

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 7. Okt 2012, 16:04
Na weil doch der String im Debug-Output komisch ist!!! (scnr)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#29

AW: Delphi xe2 und #39 =ZWEI Hochkommas

  Alt 8. Okt 2012, 09:03
@Sir Rufo

Hmm warum nutzt die Functionen keiner? Thread-Start + alle anderen Antworten -> es wissen halt zu wenige, daß es diese Funktionen gibt, oder viel mehr hat sich noch keiner damit auseinander gesetzt, wie so eine Query gesplittet wird.

Alle SQL RDBMS haben da das gleich Verhalten. Sobald der Char, welche String-Anfang/Ende signalisiert, oder der Escape-Char sich in diesem String befindet, müssen dies Chars escaped werden.

Simples Beispiel:

insert into Tabelle1 values ('Foo'bar', 'Foo'bar');

MySQL ließt nun jeden Char und erstllt eine Liste von Tokens. Quasi Token.Value/Token.Type.

die ersten Tokens bis zur Klammer übergehe ich mal. Dann folgt beim jetzigen string:

Token.Value = "Foo"
Token.Type = Quoted

Token.Value = "bar"
Token.Type = word -> da ohne Anführungszeichen

Token.Value = ", "
Token.Type = Quoted

Token.Value = "Foo"
Token.Type = word -> da ohne Anführungszeichen

Token.Value = "bar"
Token.Type = Quoted

Also ein riesen Schlamassel, da ALLE SQL Provider davon augehen: Was zwichen den Quotes steht ist DER String. um MySQL zu zwingen über die Half-Quote zu lesen, muß diese Escaped werden. Für die meisten CharSets wird hier der '\' hergenommen. Für Big5 oder GB1080 zum Beispiel ist das unmöglich, da bei den EUC kodierten charsets meisten '\' das zweite Byte darstellt.

Also zum String zurück:

insert into Tabelle1 values ('Foo\'bar', 'Foo\'bar');
...
Token.Value = "Foo'bar"
Token.Type = Quoted

Token.Value = ","
Token.Type = Symbol

Token.Value = " "
Token.Type = WhiteSpace

Token.Value = "Foo'bar"
Token.Type = Quoted

Ihr Seht: MySQL entfernt die Escape Chars auch wieder von selber.

Wenn ihr Abfragen selber strickt, deren Inhalt unbekannt ist, verwendet entweder die Escape-Functionen oder Parameter, welche genau das automatisch machen.

Gruß Michael

Geändert von EgonHugeist ( 8. Okt 2012 um 09:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 18:23 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