在使用参数之前
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;
2条答案
按热度按时间tjvv9vkg1#
当您使用参数时,您不应该转换为字符串--这是参数的工作...
通过使用参数,您不仅可以防止SQL注入,还可以使您不必知道如何在SQL字符串中传递日期时间。有些数据库使用单引号,有些使用双引号,有些使用日期‘yyyy-mm-dd’(如ElevateDB)。但它们都使用ParamByName(...).AsDateTime将日期时间发送给SQL解释器。
此外,我非常确定参数不能用来指定表名(或字段名)。一般而言,参数用于值,而不是用作字符串替换...
这也意味着参数不能用于IN(...)表达式来提供整个值列表(至少不是以我所知的任何方式)。
因此,使用参数的正确方法是:
假设表名不包含空格或为保留字。
使用FireDAC,您可以使用表名和字段名的替换值,如下所示:
(我对前两条语句不是百分之百确定,因为我从来不需要在FD代码中使用宏,但从文档中收集的信息来看,必须设置这些选项才能使其工作)。
sshcrbum2#
嗨,在红心软件的帮助下,它现在可以工作了。谢谢哈特威尔。