Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi EDBError: "Typ für Feld 'relative' unbekannt" (https://www.delphipraxis.net/54233-edberror-typ-fuer-feld-relative-unbekannt.html)

Aenogym 30. Sep 2005 09:53

Datenbank: MySQL • Version: 3.51 • Zugriff über: MySQL ODBC Driver 3.51

EDBError: "Typ für Feld 'relative' unbekannt"
 
hi ihr,

ich hab ein problem mit mySQL. zugreifen tu ich über TDatabase/TQuery.
mein code sieht so aus:

Delphi-Quellcode:
try
      Query.SQL.Clear();
      Query.SQL.Add('start transaction;');
      Query.ExecSQL();

      Query.SQL.Clear();
      Query.SQL.Add('TRUNCATE table greeting');
      Query.ExecSQL();

      Query.SQL.Clear();

      Query.SQL.Add('INSERT INTO `greeting` (`topic`, `message`, `simple`) VALUES (" ", "'+AdvGreetingHTMLPreview.Caption+'", "0")');

      Query.ExecSQL();

      Query.SQL.Clear();
      Query.SQL.Add('commit;');
      Query.ExecSQL();
    except
      Query.SQL.Clear();
      Query.SQL.Add('rollback;');
      Query.ExecSQL();
    end;
beim ausführen des INSERT-befehls bekomme ich unter bestimmten voraussetzungen den fehler:
Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt WebAdmin.exe ist eine Exception der Klasse EDatabaseError aufgetreten. Meldung: 'Typ für Feld 'relative' ist unbekannt'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK  Hilfe  
---------------------------
der fehler kommt nur, wenn innerhalb des SQL-statements folgendes vorkommt:

Zitat:

"foo:bar"
sprich: ein doppeltes anführungszeichen, dann irgendein string und dann ein doppelpunkt.
sobald dies innerhalb meines TQuery.SQL steht, bekomm ich diesen fehler an den kopf geworfen.
an der mysql kanns eigentlich nicht liegen, da ich mir das vom code genrierte statement kopiert und in phpMyAdmin getestet habe - klappt einwandfrei.

irgendwie muss der ODBC-treiber die angabe "foo:bar" als eine art feld interpretieren, dass er nicht kennt.

das problem an der sache ist, dass ich HTML-code in die tabelle einfügen muss. ich habe schon versucht, anführungszeichen zu escapen etc., aber das einzige, was hilft, ist den doppelpunkt aus dem string zu entfernen - was aber den informationsgehalt zerstört :(

könnt ihr mir helfen?

danke schonmal,
aenogym

shmia 30. Sep 2005 10:09

Re: EDBError: "Typ für Feld 'relative' unbekannt"
 
Du verwendest eine falsche SQL-Syntax!
1.) Feld- und Tabellennamen werden nicht in Hochkomma's oder Akzentzeichen (´) gesetzt.
2.) Feld- und Tabellennamen dürfen in Anführungszeichen (") gesetzt werden.
3.) Stringliterale werden in einfache Hochkomma's gesetzt
4.) Verwende Parameter (<-die sauberste Lösung) oder zumindest die Funktion QuotedStr()

Delphi-Quellcode:
      Query.SQL.Text := 'INSERT INTO greeting (topic, message, simple) VALUES ('+QuotedStr(' ')+', '+QuotedStr(AdvGreetingHTMLPreview.Caption)+','+QuotedStr('0')+')';
5.) statt Query.SQL.Clear und Query.SQL.Add reicht ein Query.SQL.Text := ...

Aenogym 30. Sep 2005 10:18

Re: EDBError: "Typ für Feld 'relative' unbekannt"
 
danke für deine antwort, shmia.

Zitat:

Zitat von shmia
Du verwendest eine falsche SQL-Syntax!
1.) Feld- und Tabellennamen werden nicht in Hochkomma's oder Akzentzeichen (´) gesetzt.
2.) Feld- und Tabellennamen dürfen in Anführungszeichen (") gesetzt werden.
3.) Stringliterale werden in einfache Hochkomma's gesetzt

:shocked: nicht? so lehrt es MySQL AB in seiner dokumentation höchstpersönlich. nungut - versuch ich's mal ohne

Zitat:

Zitat von shmia
4.) Verwende Parameter (<-die sauberste Lösung) oder zumindest die Funktion QuotedStr()

Delphi-Quellcode:
      Query.SQL.Text := 'INSERT INTO greeting (topic, message, simple) VALUES ('+QuotedStr(' ')+', '+QuotedStr(AdvGreetingHTMLPreview.Caption)+','+QuotedStr('0')+')';
5.) statt Query.SQL.Clear und Query.SQL.Add reicht ein Query.SQL.Text := ...

parameter? gut, werd ich mich mal informieren. das mit Query.SQL.Clear() zieh ich so durch, weil das der author des programms überall so macht... :roll:
(übrigens funktionierte die syntax mit dne akzenten etc. bis jetzt überall)

danke dir! :)

aenogym

Aenogym 30. Sep 2005 10:22

Re: EDBError: "Typ für Feld 'relative' unbekannt"
 
zu früh gefreut :(
das problem ist mit dieser syntax noch immer das gleiche.
dann werde ich mich mal über parameter informieren :coder:

aenogym

edit: und wieder was dazugelernt. parameter scheinen der grund für mein problem zu sei und ich hoffe, dass sie auch die lösung sind :)
(falls sich wer wundert: ich arbiete heute zume rsten mal mit den datenbank-komponenten ;) )

shmia 30. Sep 2005 10:32

Re: EDBError: "Typ für Feld 'relative' unbekannt"
 
Zitat:

Zitat von Aenogym
Zitat:

Zitat von shmia
1.) Feld- und Tabellennamen werden nicht in Hochkomma's oder Akzentzeichen (´) gesetzt.
2.) Feld- und Tabellennamen dürfen in Anführungszeichen (") gesetzt werden.
3.) Stringliterale werden in einfache Hochkomma's gesetzt

:shocked: nicht? so lehrt es MySQL AB in seiner dokumentation höchstpersönlich. nungut - versuch ich's mal ohne

MySQL lässt hier mehr als der SQL-92 Standard zu.
Das hängt auch von ANSI_QUOTES ab:
http://dev.mysql.com/doc/mysql/en/string-syntax.html
Man sollte trotzdem immer den Vorgaben von SQL-92 folgen!

Es scheint die Strategie fast aller Datenbank-Hersteller zu sein, SQL-92 zu unterstützen,
aber ausserdem eine geänderte Syntax zuzulassen.
Wenn ein Kunde eine grosse Datenbank + Anwendung entwickelt hat, kann er die Datenbank nicht mehr wechseln,
da andere Datenbanken z.B. mit dem Akzent nicht klarkommen.
(Aus dem gleichen Grund haben Felgen der Autohersteller einen unterschiedlichen Lochkreis & Nabendurchmesser)

Aenogym 30. Sep 2005 10:36

Re: EDBError: "Typ für Feld 'relative' unbekannt"
 
klingt einleuchtend ;)
danke dir, mit parametern klappt's hervorragend

aenogym


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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-2025 by Thomas Breitkreuz