如何在Delphi中用DATE编写SQL?

dw1jzc5e  于 2022-10-16  发布在  其他
关注(0)|答案(2)|浏览(217)

在使用参数之前

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;
tjvv9vkg

tjvv9vkg1#

当您使用参数时,您不应该转换为字符串--这是参数的工作...

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字符串中传递日期时间。有些数据库使用单引号,有些使用双引号,有些使用日期‘yyyy-mm-dd’(如ElevateDB)。但它们都使用ParamByName(...).AsDateTime将日期时间发送给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;

(我对前两条语句不是百分之百确定,因为我从来不需要在FD代码中使用宏,但从文档中收集的信息来看,必须设置这些选项才能使其工作)。

sshcrbum

sshcrbum2#

嗨,在红心软件的帮助下,它现在可以工作了。谢谢哈特威尔。

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;

相关问题