![]() |
Datenbank: MSSQL 2017 • Version: 17 • Zugriff über: FireDAC
MSSQL Datenbank, Select geht nicht
Hallo zusammen,
ich beschäftige mich gerade mit einer MSSQL Datenbank. Es soll ein Vorname abgefragt werden. Ich kann leider folgenden select nicht ausführen:
Code:
Er sagt: [FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver][SQL Server]Ungültiger Spaltenname "Kristian".
procedure TfrmGettingStarted.Button1Click(Sender: TObject);
begin if not dbMain.Connected then Exit; qryproducts.FetchOptions.AutoClose := False; qryproducts.SQL.Clear; qryproducts.SQL.Add('SELECT *'); qryproducts.SQL.Add('FROM kd_data') ; qryproducts.SQL.Add(' WHERE kd_data.kd_vname like'); qryproducts.SQL.Add( edit1.text ); qryproducts.Open; // [Orders] table rows are accessable here end; In MSSQL Management Studio gehts aber. Kann da jemand helfen? |
AW: MSSQL Datenbank, Select geht nicht
mach mal überall beim Add auch Leerzeichen hin, z.B. hinter dem Stern
und den Paramter quoten, zb. mit System.SysUtils.QuotedStr (und am besten auch als Parameter übergeben, nicht als SQL command Bestandteil > injection) |
AW: MSSQL Datenbank, Select geht nicht
Code:
procedure TfrmGettingStarted.Button1Click(Sender: TObject);
begin if not dbMain.Connected then Exit; qryproducts.FetchOptions.AutoClose := False; qryproducts.SQL.Clear; qryproducts.SQL.Add('SELECT *'); qryproducts.SQL.Add('FROM kd_data') ; qryproducts.SQL.Add(' WHERE kd_data.kd_vname like'); qryproducts.SQL.Add( QuotedStr(edit1.text) ); // diese Zeile ändern. qryproducts.Open; // [Orders] table rows are accessable here end; |
AW: MSSQL Datenbank, Select geht nicht
Perfekt, danke!
|
AW: MSSQL Datenbank, Select geht nicht
Noch besser wäre es (SQL-)Paramter zu verwenden.
|
AW: MSSQL Datenbank, Select geht nicht
Zitat:
Gruß K-H |
AW: MSSQL Datenbank, Select geht nicht
Zitat:
|
AW: MSSQL Datenbank, Select geht nicht
Hallo,
doch lohnt sich immer, es wachsen ja immer neue Programmierer nach, die das halt noch nicht wissen. Aber wenn man hier mit falschen (nicht so ganz schönem) Beispiel (QuotedStr) vorangeht, sollte man sich nicht wundern, dass es andere falsch machen.
Delphi-Quellcode:
Ich glaube, im Informatik-Unterricht hatte ich das mit dem Parameter (Stichwort SQL-Injection) nicht.
qryproducts.SQL.Add(' WHERE kd_data.kd_vname like :SinnvollerParameterName');
qryproducts.ParamByName('SinnvollerParameterName').AsString:= edit1.text; Da war der Lehrer schon froh, wenn wir das Select und das Where richtig geschrieben hatten ;) |
AW: MSSQL Datenbank, Select geht nicht
Hast ja Recht.
Also dann zur Vollständigkeit. So sollte das eigentlich ein besseres SQL-Statement sein:
Delphi-Quellcode:
Vorteile:
procedure TfrmGettingStarted.Button1Click(Sender: TObject);
begin if dbMain.Connected then begin qryproducts.FetchOptions.AutoClose := False; qryproducts.SQL.Clear; qryproducts.SQL.Add('SELECT *'); qryproducts.SQL.Add('FROM kd_data') ; qryproducts.SQL.Add(' WHERE kd_data.kd_vname like :Vorname'); qryproducts.SQL.ParamByName('Vorname').AsString := Edit1.Text; qryproducts.Open; // [Orders] table rows are accessable here end; end; 1. Gefahr von Code-Injection verringert 2. Firlefanz mit QuotedStr oder wildem Anführungszeichengewedel entfällt 3. Bessere Lesbarkeit (siehe dazu Punkt 2) 4. Das Prepare funktioniert besser Nachteile: In sehr seltenen Fällen muss man den Type des Parameters noch definieren, weil die automatische Umsetzung des Parameters in den richtigen Typ nicht funktioniert. Das passiert nur sehr selten und wirkt sich selbst dann nicht immer aus. Hatte ich in den letzten 5 Jahren nur einmal. Außerdem gleich mal das Exit rausgeschmissen. |
AW: MSSQL Datenbank, Select geht nicht
Kleine Änderung dazu noch:
Delphi-Quellcode:
Grundsätzlich sollten Eigenschaftsänderungen bei aktiven Queries vermieden werden (Siehe qryproducts.FetchOptions.AutoClose).
procedure TfrmGettingStarted.Button1Click(Sender: TObject);
begin if dbMain.Connected then begin if qryproducts.Active then qryproducts.Close; //bei FireDac geht auch qryproducts.Disconnect(); qryproducts.FetchOptions.AutoClose := False; qryproducts.SQL.Clear; qryproducts.SQL.Add('SELECT *'); qryproducts.SQL.Add('FROM kd_data') ; qryproducts.SQL.Add(' WHERE kd_data.kd_vname like :kd_vname'); qryproducts.SQL.ParamByName('kd_vname').AsString := Edit1.Text; qryproducts.Open; end; end; Parameterbezeichnungen wenn möglich so benennen wie das Feld (kd_vname). Ich gebe bei Verwendung von Parametern immer den Datentyp mit an, weil bei mir immer ein Fehler auftritt:
Delphi-Quellcode:
qryproducts.SQL.ParamByName('kd_vname').DataType := ftString;
qryproducts.SQL.ParamByName('kd_vname').Value := Edit1.Text; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 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