Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MSSQL Datenbank, Select geht nicht (https://www.delphipraxis.net/196884-mssql-datenbank-select-geht-nicht.html)

Dr. Jack 27. Jun 2018 14:13

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:
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;
Er sagt: [FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver][SQL Server]Ungültiger Spaltenname "Kristian".

In MSSQL Management Studio gehts aber. Kann da jemand helfen?

jobo 27. Jun 2018 14:21

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)

Jasocul 27. Jun 2018 14:22

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;

Dr. Jack 27. Jun 2018 14:35

AW: MSSQL Datenbank, Select geht nicht
 
Perfekt, danke!

mkinzler 27. Jun 2018 14:55

AW: MSSQL Datenbank, Select geht nicht
 
Noch besser wäre es (SQL-)Paramter zu verwenden.

p80286 27. Jun 2018 15:07

AW: MSSQL Datenbank, Select geht nicht
 
Zitat:

Zitat von mkinzler (Beitrag 1405960)
Noch besser wäre es (SQL-)Paramter zu verwenden.

Das wurde bisher so oft geschrieben, und wird immer noch ignoriert....

Gruß
K-H

Jasocul 28. Jun 2018 06:11

AW: MSSQL Datenbank, Select geht nicht
 
Zitat:

Zitat von p80286 (Beitrag 1405961)
Zitat:

Zitat von mkinzler (Beitrag 1405960)
Noch besser wäre es (SQL-)Paramter zu verwenden.

Das wurde bisher so oft geschrieben, und wird immer noch ignoriert....

Deswegen schreibe ich es nicht mehr. Lohnt offensichtlich den Aufwand nicht.

hoika 28. Jun 2018 06:15

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:
qryproducts.SQL.Add(' WHERE kd_data.kd_vname like :SinnvollerParameterName');
qryproducts.ParamByName('SinnvollerParameterName').AsString:= edit1.text;
Ich glaube, im Informatik-Unterricht hatte ich das mit dem Parameter (Stichwort SQL-Injection) nicht.
Da war der Lehrer schon froh, wenn wir das Select und das Where richtig geschrieben hatten ;)

Jasocul 28. Jun 2018 06:32

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:
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;
Vorteile:
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.

DasWolf 28. Jun 2018 11:06

AW: MSSQL Datenbank, Select geht nicht
 
Kleine Änderung dazu noch:

Delphi-Quellcode:
 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;
Grundsätzlich sollten Eigenschaftsänderungen bei aktiven Queries vermieden werden (Siehe qryproducts.FetchOptions.AutoClose).
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 02:08 Uhr.
Seite 1 von 2  1 2      

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