SQL: select * from ... = "integer-wert"
hallo.
und zwar, in meiner datenbank ist eine spalte vom typ string, auf die ich folgendermaßen zugreifen kann:
Delphi-Quellcode:
ed_such.text ist ein normales edit-feld.
adoquery1.sql.text := 'select * from tabelle1 where name like "%'+ed_such.text+'%"'
der rest der datenbank ist jedoch vom typ integer. nun mein problem. wie muss der sql-befehl für einen integer-wert da aussehen? habe folgendes probiert, funzt aber nicht:
Delphi-Quellcode:
such ist eine variable vom typ integer.
adoquery1.sql.text := 'select * from tabelle1 where tordiff like :such';
danke für hilfe. marcus |
Re: SQL: select * from ... = "integer-wert"
Hallo,
like kannst du nur in Verbindung mit Varchars verwenden. Manche DB´s lassen jedoch folgende Anweisung zu:
SQL-Code:
Oder du lässt es einfach so wie oben mit dem Varchar.
adoquery1.sql.text := 'select * from tabelle1 where tordiff like ''%:such%'''
|
Re: SQL: select * from ... = "integer-wert"
Integer-Werte kann man NICHT mit "LIKE" vergleichen, sondern nur mit den Vergleichsoperatoren "=", ">", "<", ">=", "<=" und "<>". Die Lösung lautet also:
Delphi-Quellcode:
Damit findest Du alle Datensätze, welche die gleiche Tordifferenz, wie eingegeben, haben. Genauso kannst Du nach größeren oder kleineren Werten suchen - du musst lediglich das Gleichheitszeichen durch den entsprechenden Operator ersetzen.
adoquery1.sql.text := 'select * from tabelle1 where tordiff like :such';
:coder: |
Re: SQL: select * from ... = "integer-wert"
@Alfons_G: dann solls ja wohl so heissen:
Delphi-Quellcode:
:lol:
adoquery1.sql.text := 'select * from tabelle1 where tordiff = :such';
z.B. in Oracle würde das aber auch so funktionieren:
Delphi-Quellcode:
Wobei das To_Char auch weggelassen werden kann.
adoquery1.sql.text := 'select * from tabelle1 where To_Char(tordiff) like ''%:such%''';
|
Re: SQL: select * from ... = "integer-wert"
Upps, das kommt davon, wenn man im Büro schnell die Antwort tippt und dabei den Code aus dem vorherigen Porting reinkopiert :oops:
Das to_char in Oracle kenne ich nur zu gut. Allerdings wird man in diesem Fall, wo es anscheinend um eine Liga-Verwaltung und die Suche nach einer Tordifferenz geht, eher nach einem Zahlenwert, als nach einem Teilstring suchen. :coder: |
Re: SQL: select * from ... = "integer-wert"
habt dank jungs :thuimb: werde ich dann gleich mal ausprobieren
Delphi-Quellcode:
adoquery1.sql.text := 'select * from tabelle1 where tordiff = :such';
|
Re: SQL: select * from ... = "integer-wert"
so.. nun hab ich das mal ausprobiert:
Delphi-Quellcode:
aber leider liefert diese abfrage kein ergebniss zurück. fehlermeldung kommt auch keine)
adoquery1.sql.text := 'select * from tabelle1 where tordiff = :such';
wenn ich den "RecordCount" ausgebe so zeigt dieser immer 0 an. weiß keinen rat mehr, da "such" als integer deklariert ist. wo ist der haken? |
Re: SQL: select * from ... = "integer-wert"
Hallo markon,
das SQL-Select sieht eigentlich korrekt aus. Hast Du es schon mit mehreren Werten für tordiff versucht. Falls Du gar nicht weiterkommst, dann poste doch mal das Stück Code. |
Re: SQL: select * from ... = "integer-wert"
hier der code:
Delphi-Quellcode:
wie gesagt, es kommt keine fehlermeldung, aber auch kein ergebnis :wall:
procedure Tfrm_spiele.bt_suchClick(Sender: TObject);
var such :integer; begin adoquery1.Close; adoquery1.sql.Clear; such := strtoint(ed_such.text); adoquery1.sql.Add ('select * from tabelle1 where TorDiff = :such'); adoquery1.Open; // oder muss adoquery1.ExecSQL; hier stehen? // adoquery1.Active; end; die spalte TorDiff ist wie gesagt "integer". schreibe ich
Delphi-Quellcode:
dann funzts...
adoquery1.sql.Add ('select * from tabelle1 where TorDiff = 9');
|
Re: SQL: select * from ... = "integer-wert"
Versuche es mal so:
Delphi-Quellcode:
procedure Tfrm_spiele.bt_suchClick(Sender: TObject);
var such :integer; begin adoquery1.Close; adoquery1.sql.Clear; such := strtoint(ed_such.text); adoquery1.sql.Add ('select * from tabelle1 where TorDiff = ' + such); adoquery1.Open; end; |
Re: SQL: select * from ... = "integer-wert"
@ r_kerber: danke dir, dein vorschlag...
Delphi-Quellcode:
...brachte folgende fehlermeldung: "Inkompatible Typen: String und Integer"
adoquery1.sql.Add ('select * from tabelle1 where TorDiff = ' + such;
...dann hab ich die zeile folgendermasen´geändert:
Delphi-Quellcode:
... und siehe da, es funzt!! :thuimb:
adoquery1.sql.Add ('select * from tabelle1 where TorDiff = ' + inttostr(such));
|
Re: SQL: select * from ... = "integer-wert"
Uuups. :oops:
Man sollte lesen was da steht.
Delphi-Quellcode:
So wäre es richtig gewesen.
adoquery1.sql.Add ('select * from tabelle1 where TorDiff = ' + ed_such.text);
|
Re: SQL: select * from ... = "integer-wert"
jo, stimmt!
Delphi-Quellcode:
ist letztlich doppelt gemoppelt, erst den string in integer und dann wieder zurückwndeln.
adoquery1.sql.Add ('select * from tabelle1 where tordiff = ' + inttostr(such));
Delphi-Quellcode:
einfach das edit-feld angeben. fertig.
adoquery1.sql.Add ('select * from tabelle1 where tordiff = ' + ed_such.text)
danke für deine hilfe :cheers: |
Re: SQL: select * from ... = "integer-wert"
Ich würde aber immer davon abraten, Benutzereingaben ungeprüft in SQL-Statements einzubauen.
Ich weiss jetzt nicht, ob Deine DB und die ADO-Schnittstelle mehrere Statements in einer SQL-Anweisung akzeptieren, aber wenn ja, dann hättest Du ein ziemliches Problem, wenn der User in das Edit ed_such folgenden Text eingibt:
Code:
Das setzt natürlich voraus, das der User gewillt ist, die Datenbank zu zerschiessen. Aber sowas soll ja leider mal vorkommen... :?
1; drop table 'tabelle1';
Gruß Wormid |
Re: SQL: select * from ... = "integer-wert"
Zitat:
|
Re: SQL: select * from ... = "integer-wert"
Hallo, ich klink mich auch wieder ein :-D
Generell würde ich jedem abraten eine SQL-Anweisung ohne Parameter zu verwenden. Bei Access Datenbanken mag das ja keine Auswirkungen haben, aber hat man einen SQL Server dann muss eine Anweisung dieser Art
SQL-Code:
vom Server jedesmal beim Ausführen neu geparst, und der jeweilige Ausfürungsplan neu erstellt werden.
adoquery1.sql.Add ('select * from tabelle1 where tordiff = ' + ed_such.text)
Hat man hier eine Multiuserumgebung (z.Bsp. einen Internetserver) wird diese Datenbank früher oder später den Geist aufgeben. Werden stattdessen Parameter verwendet kann sich der Server auf die zuletzt geparste Anweisung verlassen und braucht nur noch die Parameterwerte auszutauschen. Bsp.:
Delphi-Quellcode:
Auch wenn man keinen Datenbankserver zur Verfügung hat würde ich trotzdem vorschlagen gleich auf diese Technik zu setzten, weil die Anwendung auch besser skalierbar wird.
procedure Tfrm_spiele.bt_suchClick(Sender: TObject);
var such :integer; begin adoquery1.Close; adoquery1.sql.Clear; such := strtoint(ed_such.text); adoquery1.sql.Text := 'select * from tabelle1 where TorDiff = :such'; adoquery1.Parameters.ParamByName('such').Value := such; adoquery1.Open; end; |
Re: SQL: select * from ... = "integer-wert"
Hallo Garby,
ich kann mich dem nur anschließen. Ich wollte allerdings eine einfache Lösung anbieten. Dann sollte man auch darüber nachdenken, ob man diese Abfrage dann nicht fest in die ADOQuery einträgt und für jede Tabelle ein eigenes ADOQuery-Objekt nutzt. Gruß in's schöne Tirol, wo ich immer wieder gern Urlaub mache. :bounce1: :bouncing4: |
Re: SQL: select * from ... = "integer-wert"
Das würde der Übersichtlichkeit des Projekts sicher guttun. Ausserdem hat man dann auch den Vorteil alle Parameter und zugehörigen Einstellungen bequem im OI zu tätigen.
Aber genug davon, ich glaub wir sollten an dieser Stelle keinen Datenbank-Crashkurs veranstalten :warn: |
Re: SQL: select * from ... = "integer-wert"
@ garby
danke für dein posting. :thuimb: ist gut zu wissen was man besser machen kann. bei sehr vielen zugriffen lohnt sich das schon. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 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