使用引數之前
FDQuery.Connection := FDConnection1;
FDQuery.SQL.Text := 'SELECT * FROM ' symbol ' WHERE date >= '''
datetostr(Dfrom) ''' AND date <= ''' datetostr(Dto) '''';
FDQuery.Active := True;
它可以作業,但使用引數后,它不能作業。我哪里做錯了?
FDQuery.SQL.Text := 'SELECT * FROM :symbol WHERE date >= :Dfrom AND date <= :Dto';
FDQuery.ParamByName('symbol').AsString := symbol;
FDQuery.ParamByName('Dfrom').AsString := '''' datetostr(Dfrom) '''';
FDQuery.ParamByName('Dto').AsString := '''' datetostr(Dto) '''';
FDQuery.Active := True;
uj5u.com熱心網友回復:
當您使用引數時,您不應該轉換為字串 - 這是引數的作業......
FDQuery.SQL.Text := 'SELECT * FROM :symbol WHERE date >= :Dfrom AND date <= :Dto';
FDQuery.ParamByName('symbol').AsString := symbol;
FDQuery.ParamByName('Dfrom').AsDateTime := Dfrom;
FDQuery.ParamByName('Dto').AsDateTime := Dto;
FDQuery.Active := True;
通過使用引數,您不僅可以防止 SQL 注入,還可以使自己不必知道如何在 SQL 字串中傳遞 DateTime。一些資料庫使用單引號,一些使用雙引號,還有一些使用 DATE 'yyyy-mm-dd'(如 ElevateDB)。但他們都使用 ParamByName(...).AsDateTime 將 DateTime 發送到 SQL 解釋器。
另外,我很確定不能使用引數來指定表名(或就此而言的欄位名)。一般來說,引數用于值而不是字串替換......
這也意味著引數不能用于 IN (...) 運算式來給出整個值串列(至少不是以我所知道的任何方式)。
所以使用引數的正確方法是:
FDQuery.SQL.Text := 'SELECT * FROM ' symbol ' WHERE date >= :Dfrom AND date <= :Dto';
FDQuery.ParamByName('Dfrom').AsDateTime := Dfrom;
FDQuery.ParamByName('Dto').AsDateTime := Dto;
FDQuery.Active := True;
假設表名不包含空格或者是保留字。
使用 FireDAC,您可以對表名和欄位名使用替換值,如下所示:
FireDAC.Stan.Option.TFDResourceOptions.MacroExpand := TRUE;
FireDAC.Stan.Option.TFDResourceOptions.MacroCreate := TRUE;
FDQuery.SQL.Text := 'SELECT * FROM &symbol WHERE date >= :Dfrom AND date <= :Dto';
FDQuery.MacroByName('symbol').AsRaw := symbol;
FDQuery.ParamByName('Dfrom').AsDateTime := Dfrom;
FDQuery.ParamByName('Dto').AsDateTime := Dto;
FDQuery.Active := True;
(我對前兩個陳述句不是 100% 確定,因為我從來不需要在我的 FD 代碼中使用宏,但是根據我從檔案中收集到的資訊,必須設定這些選項才能使其作業)。
uj5u.com熱心網友回復:
嗨,在 HeartWare 的幫助下,它現在可以作業了。感謝 HeartWare。
FDQuery.Stan.Option.TFDResourceOptions.MacroExpand := TRUE;
FDQuery.Stan.Option.TFDResourceOptions.MacroCreate := TRUE;
FDQuery.SQL.Text := 'SELECT * FROM &symbol WHERE date >= :Dfrom AND date <= :Dto';
FDQuery.MacroByName('symbol').AsRaw := symbol;
FDQuery.ParamByName('Dfrom').AsDateTime := Dfrom;
FDQuery.ParamByName('Dto').AsDateTime := Dto;
FDQuery.Active := True;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512523.html
上一篇:如何讓一個類接受另一個類的引數?
下一篇:按版本檢索已洗掉的AWSS3檔案
