Autor Beitrag
mirko07
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 26.01.09 22:09 
Hallo Leute!
Ich hab ein Problem mit Delphi 6.
Ich möchte über ein ADOQuery eine Abfrage machen in Sinne von:
select * from tabelle where stadt in (:stadt)
:stadt ist ein String-Parameter der übergeben wird in der Form: 'Leipzig','Düsseldorf'...
Das funktioniert nicht. Ohne Anführungsstriche klappt es mit einer Stadt. Mit mehreren nicht.
Ich hab in Turorials nachgesehen und mach es eigentlich richtig.
Kann mir da jemand helfen?

Mirko


Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am Di 27.01.2009 um 16:57
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Mo 26.01.09 22:16 
Ich hab solche Probleme auch manchmal... Meistens klappt es dann mit "AND" statt den Kommata aber das sieht nicht so schön aus ...
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1338
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mo 26.01.09 22:26 
Zeig mal deinen Quelltext wie es nicht geht.
Ansonsten: Beachtest du das jeder einzelne Wert in Hochkomma muss? (nicht das Komma dazwischen mit erwischen).
Versuch es erstmal ohne Parameter und mit fest eingetragenen Werten.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
mirko07 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 27.01.09 16:49 
Vielen Dank rfür Eure Mühen.
Das ist leider alles nicht zielführend.
Direkteintragen ging nicht. Egal welche Anführungszeichen ich versucht habe.
Auf den Parameter kann ich nicht verzichten, da die Städte dynamisch aus einer Liste geladen werden.
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Di 27.01.09 16:53 
wäre es nicht das selbe wenn du statt WHERE stadt IN einfach
WHERE stadt LIKE 'Leipzig','Duesseldorf'...
?
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 27.01.09 17:00 
user profile iconNiko S. hat folgendes geschrieben Zum zitierten Posting springen:
wäre es nicht das selbe wenn du statt WHERE stadt IN einfach
WHERE stadt LIKE 'Leipzig','Duesseldorf'...
?

Nein, das ist nicht ganz exakt. Mit = und somit auch mit IN prüfst du auf Gleichheit, mit LIKE kannst du auch noch auf mehr Sachen prüfen (in Kombination mit % und _ z.B.).
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Di 27.01.09 17:48 
Okay stimmt schon aber es ist doch so dass es nicht funktioniert mit der auflistung ... warum gehts denn nicht mit "AND" außer dass es nicht so schön aussieht amsonsten doch nur mal zu testzwecken das bei pma oder so reinsetzen o:
Ich versuch ja nur zu helfen .. :x
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1338
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 27.01.09 18:22 
Wie schon gesagt, zeig mal deinen Quelltext, vieleicht ist ein Fehler an einer Stelle der dir einfach nicht auffällt.
..oder dein fertiges SQL Statement.

Mein Versuch mit IN hat problemlos geklappt. (Datenbank Advantage)
ausblenden SQL-Anweisung
1:
select * from countries where name in ('ARUBA', 'ARMENIA')					

Ich habe wie erwartet zwei Datensätze bekommen.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 28.01.09 08:09 
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Mein Versuch mit IN hat problemlos geklappt. (Datenbank Advantage)
ausblenden SQL-Anweisung
1:
select * from countries where name in ('ARUBA', 'ARMENIA')					

Ich habe wie erwartet zwei Datensätze bekommen.

Dann schreib mal bitte Deine Abfrage so um, dass ARUBA und ARMENIA nicht fest codiert sind, sondern dass man sie als Parameter übergeben kann. Ich denke, das ist das Problem.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 28.01.09 08:31 
Ein Parameter in einer Query ist kein Platzhalter!

Die Liste der 'IN' Klausel kannst Du nicht korrekt parametrieren, denn Delphi wird um den String nochmal Hochkommata legen und die Hochkommata im ursprünglichen String 'escapen', d.h. verdoppeln, sodaß die Query letztendlich so aussieht:
ausblenden SQL-Anweisung
1:
select * in tabelle where feld in ('''Leipzig'',''Dresden''')					

Somit liefert diese Abfrage, bei denen feld = 'Leipzig','Dresden' ist, was doch ziemlich selten vorkommt.

Du musst dir dein SELECT selbst zusammenbauen, z.B. mit der Formatanweisung:
ausblenden Delphi-Quelltext
1:
2:
StaedteListe := QuotedStr('Leipzig')+','+QuotedStr('Dresden');
MyQuery.SQL.Text := Format('select * in tabelle where feld in (%s),[Staedteliste]));

Dann sollte das auch funktionieren.

_________________
Na denn, dann. Bis dann, denn.
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Mi 28.01.09 08:35 
Und wenn du es in 2 Variablen machst?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var strKrit, strSQL: String;
Begin
  strKrit:= '"ARUBA", "ARMENIA"';
  strSQL:= 'SELECT * FROM Tabelle WHERE Feld In (' + strKrit + ')';
End;

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 28.01.09 08:40 
Das ist sehr schade, dass man mit IN keine echten Parameter nutzen kann. Beim Zusammensetzen der SQL-Strings müsste man ja z.B. auch an Problemfälle wie z.B. SQL-Injection denken und z.B. das ' richtig maskieren.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Mi 28.01.09 09:22 
In() macht eigentlich nur Sinn, wenn die Werte aus einer Usereingabe resultieren, die nirgends gespeichert ist. Ansonsten kann man mit LEFT JOIN's und Prüfungen auf Null/Nicht Null das gleiche erreichen und im Gegensatz zu Not In() auch noch Zeit sparen.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 28.01.09 16:22 
Wobei das DBMS nach meinem Kenntnisstand aus dem "in" sowieso intern eine OR-Verkettung macht.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 28.01.09 16:38 
Nein, IN ist eine Subquery, läuft auf
ausblenden SQL-Anweisung
1:
where exists (select wert from {Pseudo-Tabelle mit den Werten})					

hinaus.

Oh, und bei Oracle/DOA nimmt man dafür dann den Parameter-Typ Substitution. Keine Ahnung, obs den bei anderen auch gibt... Nur dass die dann wieder genauso Injection-Anfällig sind, da sie noch vorm Parsen ersetzt werden. Aber immerhin schon Serverseitig ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."