| Autor |
Beitrag |
mirko07
Hält's aus hier
Beiträge: 6
|
Verfasst: 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 Narses: Topic aus Dateizugriff verschoben am Di 27.01.2009 um 16:57
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: 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
      
Beiträge: 1338
Erhaltene Danke: 120
Win 10
RIO, CE, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: 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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Di 27.01.09 17:00
Niko S. hat folgendes geschrieben : | 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.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: 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 .. 
|
|
Sinspin
      
Beiträge: 1338
Erhaltene Danke: 120
Win 10
RIO, CE, Lazarus
|
Verfasst: 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)
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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 28.01.09 08:09
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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:
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:
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
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Mi 28.01.09 08:35
Und wenn du es in 2 Variablen machst?
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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: 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
|
Verfasst: Mi 28.01.09 16:22
Wobei das DBMS nach meinem Kenntnisstand aus dem "in" sowieso intern eine OR-Verkettung macht.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 28.01.09 16:38
Nein, IN ist eine Subquery, läuft auf
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."
|
|