![]() |
variabler Tabellenname in SQL-Abfrage
Hi Leute,
ich entwickle derzeit eine Suchfunktion, mit der ich eine Datenbank durchsuchen kann. Dafür habe ich erst zwei Edits genommen, denen eine feste Spalte in der Tabelle zugewiesen (dass diese nur die eine Spalte durchsucht, was auch problemlos funktioniert
Delphi-Quellcode:
Jetzt versuche ich allerdings eine dritte Suchfunktion hinzuzufügen, wo der Spaltenname nicht vorgegeben ist, sondern durch eine ComboBox ausgewählt werden kann. Ich versuche den Spaltennamen über eine Variable (CB1Spalte) in die SQL-Abfrage einzugeben, allerdings weiß ich nicht wie ich der Abfrage klarmache, dass ich aktuell eine Variable benutze und diese nicht der Spaltenname ist
SQLBefehl := 'SELECT * FROM KST_Lagerbewertung';
if (Edit1.Text <> '') then SQLBefehl := SQLBefehl + (' WHERE Artikelbezeichnung LIKE ''' + StringReplace(Edit1.Text, '*', '%', [rfReplaceAll]) + '%''');
Delphi-Quellcode:
Jetzt meine Frage, wie genau kann ich Delphi, bzw der SQL-Abfrage, klarmachen, dass CB1Soalte nur eine Variable ist und ich deren Wert benötige ?
if (Edit3.Text <> '') then
begin CB1Spalte := ComboBox1.Text; SQLBefehl := SQLBefehl + (' WHERE ''CB1Spalte'' LIKE ''' + StringReplace(Edit3.Text, '+', '%', [rfReplaceAll]) + '%'''); end; |
AW: variabler Tabellenname in SQL-Abfrage
Du kannst es der Abfrage nicht "klarmachen"
Der Spaltenname muss aus Deiner Komobox entnommen werden und im Klartext in die Abfrage eingebaut werden. p.s.: dabei keine Hochkommata verwenden, sonst wird es für eine Textkonstante gehalten. |
AW: variabler Tabellenname in SQL-Abfrage
Wie entnehme ich den Spaltennamen den aus der Combobox, etwa mit Combobox1.Text ?
|
AW: variabler Tabellenname in SQL-Abfrage
Ja, machst Du doch schon. Du musst die Variable halt auch so mit + (Textkokatenierung) einbinden, wie Deinen Suchwert (Den man im Übrigen besser als Parameter einbinden würde.
Aber alles der Reihe nach. |
AW: variabler Tabellenname in SQL-Abfrage
Es tut mir leid, aber so genau verstehe ich nicht wie du das mit dem + meinst. Ich programmiere noch nicht so lange und kenne das leider noch nicht
Delphi-Quellcode:
Es sieht jetzt so aus, allerdings erhalte ich noch eine Fehlermeldung, wegen falscher Syntax in der Nähe von LIKE
begin
CB1Spalte := ComboBox1.Text; SQLBefehl := SQLBefehl + (' WHERE +CB1Spalte+ LIKE ''%' + StringReplace(Edit3.Text, '*', '%', [rfReplaceAll]) + '%'''); end; |
AW: variabler Tabellenname in SQL-Abfrage
Zitat:
Delphi-Quellcode:
begin
CB1Spalte := ComboBox1.Text; SQLBefehl := SQLBefehl + (' WHERE '+CB1Spalte+' LIKE ''%' + StringReplace(Edit3.Text, '*', '%', [rfReplaceAll]) + '%'''); end; |
AW: variabler Tabellenname in SQL-Abfrage
So klappt es, danke schön :thumb:
|
AW: variabler Tabellenname in SQL-Abfrage
Suchst Du sowas in der Art? (Auch wenn's schon zu spät ist ;-))
Delphi-Quellcode:
function CreateSQL(ATabellen : String; ASpalten : String; ASuchbegriff : String) : String;
var SQLSuchbegriff : String; begin Result := Format('select * from %s',[ATabelle]); if (ASpalten <> '') and (ASuchbegriff <> '') then begin SQLSuchbegriff := Trim(ASuchbegriff); SQLSuchbegriff := StringReplace(SQLSuchbegriff, '*', '%', [rfReplaceAll]); SQLSuchbegriff := StringReplace(SQLSuchbegriff, '?', '_', [rfReplaceAll]) SQLSuchbegriff := QuotedStr(SQLSuchbegriff + '%'); Result := Format('%s where %s like %s',[Result,ASpalte,SQLSuchbegriff]); end; end; // Aufruf SQLBefehl := CreateSQL(ComboBoxTabellennamen.Text, ComboBoxSpaltennamen.Text, EditSuchbegriff.Text); |
AW: variabler Tabellenname in SQL-Abfrage
Keine Hochkomma stimmt nicht.
Es kommt aber auf die Syntax des jeweiligen DBMS drauf an. Denn es gibt verschiedene "Hochkomma" ... " ' ´ ` usw. und die werden unterschiedlich verwendet, also entweder für "Strings" oder eben auch für "Namen". Derartige zusammengebaute SQLs verleiten doch nahezu zu SQL-Injections? :stupid: Es gibt garantiert irgendwo in den verwendeten Zugriffskomponenten entsprechende Funktionen zum "Quoten und Escapen" von Werten/String und von Bezeichnern, welche man bei sowas besser auch verwenden sollte. Und wenn auch ständig immerwieder welche ![]() |
AW: variabler Tabellenname in SQL-Abfrage
Dann muss man mit Parametern arbeiten (wobei man Tabellenanem nicht über Parameter in eine Abfrage bekommt), ohne zu wissen, was für Komponenten genutzt werden, ist da ein Beispiel schwierig.
Da ist dann QuotedStr ungefähr genausogut wie eine Reihe von ', wie im ersten Post bei
Delphi-Quellcode:
SQLBefehl := SQLBefehl + (' WHERE Artikelbezeichnung LIKE ''' + StringReplace(Edit1.Text, '*', '%', [rfReplaceAll]) + '%''');
Frei nach dem Motto, passt meistens aber nicht immer und ja, beides ist bekanntermaßen nicht perfekt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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