AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi variabler Tabellenname in SQL-Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

variabler Tabellenname in SQL-Abfrage

Ein Thema von Luca Haas · begonnen am 9. Okt 2017 · letzter Beitrag vom 10. Okt 2017
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: variabler Tabellenname in SQL-Abfrage

  Alt 9. Okt 2017, 22:21
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

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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: variabler Tabellenname in SQL-Abfrage

  Alt 9. Okt 2017, 22:48
Also ich bezeichne es wie folgt:
Hochkomma = '
Anführungszeichen = "
Tick = ´
Backtick = `

Der entscheidende Punkt für den Anfang ist doch erstmal:
Tabellen und Feldnamen gehen idealerweise im SQL "Fließtext" einfach so ohne weiteres ein, keine Hochkomma oder wie auch immer.
Es gibt in mysql (besonders) oder auch woanders (Access dann noch mit eckigen Klammern) dieses Theater, damit man auch Leerzeichen und Chinesisch usw. in die Feldbezeichner bringen kann.
Ich hab es lieber clean, ASCII ANSI Bezeichner auf Englisch und fertig.

Das ganze Problem hat erstmal nichts damit zu tun, wie ich mein SQL dann zusammensetze mit variablen Spalten.
Einfache String Konkatenierung. Dabei muss dann im Quelltext ggF. escaped werden.

Das nächste Problem ist dann die Nutzung von Parametern für die Werteangaben. Das sollte man natürlich machen, wegen kann man überall nachlesen.

Dieses Verfahren mit den Parametern funktioniert nach meiner Kenntnis aber nicht mit Feldnamen.

Im Ergebnis habe ich also Parameter eingesetzt und bin u.U. trotzdem noch nicht gegen Injection gefeit.
Das kann man aber doch wohl verhindern, indem man die Feldnamen nicht beliebig macht, sondern Wertelisten vorgibt, oder?
Also mit einer Combobox ohne Editmöglichkeit.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: variabler Tabellenname in SQL-Abfrage

  Alt 10. Okt 2017, 08:56
Dieses Verfahren mit den Parametern funktioniert nach meiner Kenntnis aber nicht mit Feldnamen.
Du könntest Dir hier mit einem "Wörterbuch" der vorhandenen Tabellen und Felder weiterhelfen. Damit ist dann auch die Gefahr der Injection gemindert.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#4

AW: variabler Tabellenname in SQL-Abfrage

  Alt 10. Okt 2017, 09:50
Hmm..

Du könntest Dir hier mit einem "Wörterbuch" der vorhandenen Tabellen und Felder weiterhelfen. Damit ist dann auch die Gefahr der Injection gemindert.
Je nach Verbindung zur Datenbank kannst Du von der Datenbank auch die vorhandenen Tabellen und Felder auslesen und somit dein 'Wörterbuch' dynamisch erstellen.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: variabler Tabellenname in SQL-Abfrage

  Alt 10. Okt 2017, 11:27
Die TAdoConnction hat 'ne Methode zum Holen der Tabellennamen. Das Ergebnis wird in eine Stringliste geliefert. Dafür kann man ComboBox.Items nehmen.

Ebenfalls gibt es eine Methode zum Holen der Spaltennamen einer Tabelle, auch hier ist das Ergebnis eine Stringliste, kann also Items einer weiteren ComboBox sein.

Wenn sich der ItemIndex der Combobox für die Tabellennamen ändert, befüllt man dann die ComboBox für die Spaltennamen entsprechen (geht einfach über die Ereignisroutinen).

Beim Zusammenbauen des SQLs nimmt man dann nicht mehr ComboBox.Text sondern ComboBox.Items[ComboBox.ItemIndex] und schon hat man eine sichere Auswahl von Tabellen und Spaltennamen.

Wenn der ItemIndex der ComboBoxen kleiner 0 ist, gibt man dem Anwender ggfls. eins auf die Finger, weil er was ungültiges in ComboBox.Text eingegeben hat oder bei ItemIndex = -1 macht man einfach nichts. (Button zum Schließen der Suchmaske disablen, keine Zuweisung des SQLs an die Query ...)

Damit der Anwender über die Eingabe des Suchbegriffes keinen "Mist" mehr machen kann, fügt man, statt der Eingabe, in das SQL einen Parameter ein und befüllt diesen dann mit der Eingabe. Dadurch spart man sich dann auch direkt das Rummhampeln mit ' und '' und ''' und QuotedStr.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: variabler Tabellenname in SQL-Abfrage

  Alt 10. Okt 2017, 12:23
Die TAdoConnction hat 'ne Methode zum Holen der Tabellennamen. Das Ergebnis wird in eine Stringliste geliefert. Dafür kann man ComboBox.Items nehmen.
Die Funktion ist mit Vorsicht zu genießen, da nicht alle Views/Tabellen zurück geliefert werden (ist je nach DB unterschiedlich) darum lieber die DB direkt fragen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: variabler Tabellenname in SQL-Abfrage

  Alt 10. Okt 2017, 12:31
Ja, stimmt schon, aber dann verabschieden wir uns sehr schnell von der Datenbankunabhägigkeit.

Und für 'nen Programmiereinsteiger, der gerade seine erste Datenbankapplikation schreibt, dürften die hier von uns vorgeschlagenen Sachen weit über das hinausgehen, was man zum ersten Lernen so benötigt.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#8

AW: variabler Tabellenname in SQL-Abfrage

  Alt 10. Okt 2017, 12:38
Die TAdoConnction hat 'ne Methode zum Holen der Tabellennamen. Das Ergebnis wird in eine Stringliste geliefert. Dafür kann man ComboBox.Items nehmen.
Die Funktion ist mit Vorsicht zu genießen, da nicht alle Views/Tabellen zurück geliefert werden (ist je nach DB unterschiedlich) darum lieber die DB direkt fragen.
.. und es funktioniert wahrscheinlich nur mit ADO so

Hingegen ein SQL-Query wie

Code:
Select TABLE_NAME, COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
order by TABLE_NAME
functioniert meines wissen auf MariaDB, MySQL, PostgreSQL ,SQL-Server.... mit diversern Query Komponenten und liefert dir direkt den Tabellennamen mit den Columnenamen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 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