Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Unknown column bei TSQLQuery auf zwei Tabellen (Left join) (https://www.delphipraxis.net/133865-unknown-column-bei-tsqlquery-auf-zwei-tabellen-left-join.html)

michiww 11. Mai 2009 08:46

Datenbank: MySql • Version: 5.0.x • Zugriff über: dbexpress

Unknown column bei TSQLQuery auf zwei Tabellen (Left join)
 
Hallo, ich bin von Zeos/Delphi 2007 auf dbexpress/Delphi 2009 umgestiegen und nun bald am verzweifeln, ich hoffe mir kann von Euch jemand helfen!
Folgendes kleines SQL Statement liefert mir eine Exception unter Delphi 2009, funktioniert aber prima mit dem mysql Client aber auch mit dem in Delphi integrierten Datenexplorer. Der Fehler tritt nur auf wenn ich zwei Tabellen verbinde (hier ein Left Join). Als Fehlermeldung kommt "Unknown column rights.rightID in Where clause". Das Feld rights.rightID gibt es aber in der Tabelle rights.
Der Fehler kommt auch nur bei einer TSQLQuery bei einer TSQLSimpleDataSet Abfrage funktioniert es ebenfalls ohne Fehler.

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
 SQLquery1.SQL.Text:='SELECT allocrights.rightID, rights.rightID, allocrights.userID FROM allocrights, rights WHERE allocrights.rightID=rights.rightID';
 SQLquery1.Open;
 Memo1.Lines.Add(SQLquery1.Text);
 Memo1.Lines.Add(IntToStr(SQLquery1.RecordCount));     <==== Exception mit Fehler "Unknown column rights.rightID
 SQLquery1.Close;
end;
Vielen Dank
Michael

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 11. Mai 2009 08:53

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Wird vielleicht Groß-/Kleinschreibung unterschieden
BTW: Ich würde mit Tabellenaliasen arbeiten
SQL-Code:
SELECT
    a.rightID, r.rightID, a.userID
FROM
    allocrights a, rights r
WHERE
    a.rightID=r.rightID;

hoika 11. Mai 2009 08:54

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Hallo,

ich würde eh die "neue" Syntax nehmen


SQL-Code:
SELECT
  allocrights.rightID, rights.rightID, allocrights.userID
FROM allocrights
JOIN rights on allocrights.rightID=rights.rightID

Ev. heisst das bei MySQL auch INNER JOIN.
Sie auch hier:
MySQL Join


Aber so nebenbei, die alte Join-Syntax sollte trotzdem gehen.


Heiko

michiww 11. Mai 2009 09:56

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Zitat:

Zitat von hoika
Hallo,

ich würde eh die "neue" Syntax nehmen


SQL-Code:
SELECT
  allocrights.rightID, rights.rightID, allocrights.userID
FROM allocrights
JOIN rights on allocrights.rightID=rights.rightID

Ev. heisst das bei MySQL auch INNER JOIN.
Sie auch hier:
MySQL Join


Aber so nebenbei, die alte Join-Syntax sollte trotzdem gehen.


Heiko

Hallo, der Tipp von Heiko funktioniert zwar (Danke!) aber nur weil hier keine WHERE clause mehr Verwendung findet, sobald ich auf ein Feld der zweiten Tabelle zugreifen möchte (z.B. rights.sysID) kommt nach wie vor eine Exception (nun "Unknown column rights.sysID") , sogar wenn ich vorher beim Select "SELECT *" angegeben habe.

SQL-Code:
SELECT *
FROM allocrights
JOIN rights ON allocrights.rightID=rights.rightID
WHERE allocrights.userID=5910 And rights.sysID=23;
;

michiww 11. Mai 2009 11:07

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Hallo, es muss sich wohl um einen Fehler in Delphi 2009 handeln, da meine Datenbank nur folgendes Kommando bekommt.
SQL-Code:
SELECT * FROM allocrights
und nicht
SQL-Code:
SELECT * FROM allocrights, rights
Hat den jemand schon mal erfolgreich ein SQL Select Statement auf zwei Tabellen mit einer TSQLQuery abgesetzt?
Vielen Dank!

mkinzler 11. Mai 2009 11:10

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Müsste imho auch
SQL-Code:
SELECT allocrights.*, rights.* FROM allocrights, rights;
Wie gesagt machen Tabellenaliases da ganze übersichtlicher

hoika 11. Mai 2009 11:33

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Hallo,

liegt viell. am DBExpress.

Hier gab es auch Probleme.
siehe letzter Eintrag.
MySQL DBExpess

Heiko

michiww 11. Mai 2009 11:33

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Zitat:

Zitat von mkinzler
Müsste imho auch
SQL-Code:
SELECT allocrights.*, rights.* FROM allocrights, rights;
Wie gesagt machen Tabellenaliases da ganze übersichtlicher

Hallo mkinzler, habe ich schon probiert auch mit Aliases macht aber keinen Unterschied.
Der Fehler wandert sogar mit, wenn ich
SQL-Code:
SELECT a.*, r.*
FROM rights r, allocrights a
WHERE a.rightID=r.rightID AND a.userID=5910 And r.sysID=23;
ausführe kommt Unknown column a.rightID

Der Fehler wandert sogar mit, wenn ich
SQL-Code:
SELECT a.*, r.*
FROM allocrights a, rights r,
WHERE a.rightID=r.rightID AND a.userID=5910 And r.sysID=23;
ausführe kommt Unknown column r.rightID
d.h. je nachdem welche Tabelle an zweiter Stelle steht wird abgeschnitten und der MySQL Server bringt dann natürlich einen Fehler.

jbg 11. Mai 2009 11:45

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Zitat:

Memo1.Lines.Add(IntToStr(SQLquery1.RecordCount)); <==== Exception mit Fehler "Unknown column rights.rightID
Darum gilt bei uns Firmenweit die Regel: "RecordCount von TSQLQuery darf nicht genutzt werden".

Denn eine TSQLQuery muss den SQL-Ausdruck parsen um das "Count(*)" an der richtigen Stelle einfügen zu können. Und dieser Parser ist komplett überfordert, wenn er auf einen JOIN trifft. Zudem wird unter bestimmten Umständen auch mal die gesamte WHERE Klausel weggelassen, was dann natürlich zu völlig falschen Daten führt.
Also besser einen eigenen "SELECT COUNT(*)" abfeuern. Damit ist man auf der sicheren Seite.

michiww 11. Mai 2009 12:41

Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
 
Zitat:

Zitat von jbg
Zitat:

Memo1.Lines.Add(IntToStr(SQLquery1.RecordCount)); <==== Exception mit Fehler "Unknown column rights.rightID
Darum gilt bei uns Firmenweit die Regel: "RecordCount von TSQLQuery darf nicht genutzt werden".

Denn eine TSQLQuery muss den SQL-Ausdruck parsen um das "Count(*)" an der richtigen Stelle einfügen zu können. Und dieser Parser ist komplett überfordert, wenn er auf einen JOIN trifft. Zudem wird unter bestimmten Umständen auch mal die gesamte WHERE Klausel weggelassen, was dann natürlich zu völlig falschen Daten führt.
Also besser einen eigenen "SELECT COUNT(*)" abfeuern. Damit ist man auf der sicheren Seite.

Ja, ist in der Tat so. Folgender Code liefert bei mir nun das richtige Ergebnis. Vielen Dank jbg !!!
Ich werde als Delphi 2009 Kunde dazu ein Ticket bei embarcadero aufmachen, die sollen das mal endlich fixen.

SQL-Code:
SELECT COUNT(*) FROM rights, allocrights WHERE allocrights.rightID=rights.rightID AND allocrights.userID=5910 And rights.sysID=23;
Delphi-Quellcode:
SQLquery1.Open;
Memo1.Lines.Add(IntToStr(SQLquery1.FieldByName('count(*)').AsInteger));
SQLquery1.Close;
[edit=mkinzler]Delphi-Tag ergänzt Mfg, mkinzler[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Seite 1 von 2  1 2      

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