![]() |
Datenbank: MySQL • Version: 5.x • Zugriff über: MyDac
Parameterverwendung bei DB-, Feld- und Tabellennamen
Hallo zusammen,
ich habe früher meine SQL-Statements immer über den Formatbefehl zusammengesetzt, z.B.:
Code:
Da dies Methode ziemlich unsicher ist, wenn der Tabellenname beispielsweise von einem User eingetippt werden kann (Stichwort "SQL-Injection"), möchte ich künftig lieber sauber mit Parametern arbeiten. Bei Values - z.B. in Where-Bedingungen - ist das auch gar kein Problem. Aber bei Feld-, DB- und Tabellennamen funktioniert das scheinbar nicht. Beispiel:
MyQuery.SQL.Text := format('SELECT * FROM `%s`;',[Tabellenname]);
Code:
Das führt zu einem Fehler, da der Tabellenname offenbar mit führendem und schließendem Hochkomma in das SQL-Staement eingebaut wird.
MyQuery.SQL.Text := 'SELECT * FROM :TabName;';
MyQuery.ParamByName('TabName').AsString := TabellenName; MyQuery.Open; :TabName in die bei Feld- und Tabellennamen üblichen Hochkommas zusetzen (`:TabName`), hilft auch nicht... Übersehe ich da was oder funktionieren DB-, Tabellen- und Feldnamen einfach nicht über Parameter? Danke im Voraus! Freejay |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Nimm ein Makro:
![]() |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Du kannst lediglich Werte parametrisieren, aber keine (Tabellen-, Feld- oder sonstigen) Bezeichner, das hast Du richtig erkannt.
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
"Macro" ist ja dafür ein komischer Name, aber das ist genau das, was ich brauche! ;-)
Dank Euch! |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Warum komisch, es ist ja eine Makroersetzung innerhalb der Clientkomponenten.
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Ich verstehe und einem Makro ungefähr folgendes:
Zitat:
Für mich hat das Ersetzen von bestimmten kleinen Strings in einem größeren String durch andere kleine Strings mit dem wie oben verstandenen Begriff "Makro" nicht viel zu tun. Aber das darf natürlich jeder beliebig anders sehen! ;-) |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Falls nicht würde ich den eingegebenen Text anhand von System-Tabellen verifizieren (gibt es eine Tabelle, dessen Text gleich ist wie der eingegebene) und es dann wie im Usprungspost selbst ersetzen. |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Die Benutzung von Parametern verhindert allerdings meines Wissens nach sicher SQL-Injections. |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Wenn diese vom DBMS direkt unterstützt werden und nicht von der Zugriffsschicht emuliert werden.
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Delphi-Quellcode:
function SQL_Beispiel:String;
var s:TSQL; begin s:=TSQL.Create; s.Add := 'Select'; s.Add := ' Wert1,'; s.Add := ' Wert2,'; s.Add := ' Wert3'; s.Add := 'From'; s.Add := ' Tabelle'; s.Add := 'Where'; s.Add := ' Wert4 = ' + s.oracleStr('Suchstring'); // sowas wie QuotedStr s.Add := ' and Wert5 > ' + s.oracleDateOfStr('01.12.2015'); // würde zu To_Date('01.12.2015','dd.mm.yyyy') Result:=s.Text; //s.Show //zum Anzeigen des Statements in einem Memo eines kleinen Popup-Forms. s.Free; end; |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Delphi-Quellcode:
type
TOracleHelper = class helper for TStrings public function oracleStr(const value: string): string; function oracleDateOfStr(const value: string): string; end; function SQL_Beispiel: String; var s: TStringList; begin s := TStringList.Create; try s.AddStrings([ 'Select', ' Wert1,', ' Wert2,', ' Wert3', 'From', ' Tabelle', 'Where', ' Wert4 = ' + s.oracleStr('Suchstring'), ' and Wert5 > ' + s.oracleDateOfStr('01.12.2015') ]); Result := s.Text; finally s.Free; end; end; |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Im alten D6 geht das so glaub ich leider noch nicht. Auch fehlen der Stringlist ja die schönen Umwandelfunktionen. Wobei man die in dem Beispiel gezeigten ja auch nicht wirklich braucht, wenn man stattdessen mit Parametern arbeitet, insofern kann man sich bei neueren Delphis durchaus die Mühe einer eigenen Klasse sparen.
Nur aus Neugier: Wie funktiert das eigentlich mit dem Datum als Parameter, wenn man das gewohnte deutsche Datumsformat im String hat "15.03.2013" die Datenbank aber intern mit US-Schema arbeitet? |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Zitat:
Delphi-Quellcode:
MyQuery.SQL.Text := 'INSERT INTO FooTable (FooDate,FooStr,FooInt) VALUES (:1,:2,:3);';
MyQuery.Params[0].AsDateTime := NOW; // Funktioniert nur, wenn FooDate in der Datenbank ein DateTime-Feld ist. MyQuery.Params[1].AsString := 'Die Frage aller Fragen:'; MyQuery.Params[2].AsInteger := 42; Mavarik Oder war das nicht die Frage? |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Zitat:
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Delphi-Quellcode:
MyQuery.Params[0].AsDateTime := StrToDatetime('15.03.2013'); //?? Da müssen aber die FormatSettingspassen oder?
MyQuery.Params[0].AsString := '15.03.2013'; //Was müsste wo eingestellt werden, damit das klappt? |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Zitat:
Delphi-Quellcode:
wird der Datentyp des Parameters festgelegt. Mit
As<Type>
Delphi-Quellcode:
wird also ein (Wide-)String-Parameter gesetzt, was hier aber wohl nicht gewünscht ist.
AsString
Delphi-Quellcode:
wäre hier der korrekte Ansatz.
AsDateTime
Was die FormatSettings anbelangt: Die können bei einem aktuelleren Delphi als zweiter Parameter an ![]() ![]() Wenn das Datum nicht als String, sondern als Werte für Tag, Monat und Jahr vorliegt, geht auch ein ![]() |
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Delphi-Quellcode:
Geht übrigens nicht.
MyQuery.Params[0].AsDateTime := '20.01.2016'
|
AW: Parameterverwendung bei DB-, Feld- und Tabellennamen
Makros werden oft direkt "ersetzt", aber man kann ja vor Zuweisung an das Makro die Escape-Funktion für Bezeichner darauf anwenden.
bei PgDAC z.B. TPgTextConverter.EscapeString quote_ident in der DB Und eventuell wird dir auch eine Typkonvertierung angeboten
SQL-Code:
SELECT * FROM 'table'::regtype -- SELECT * FROM CAST('table' AS regtype)
SELECT * FROM :table::regtype -- SELECT * FROM CAST(:table AS regtype) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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 by Thomas Breitkreuz