EConvertError, когда я фильтрую базу данных sqlServer с помощью FireDac - PullRequest
0 голосов
/ 12 июня 2018

Я использую Delphi 10.2.3 Tokyo с FireDac и устанавливаю соединение с базой данных SqlServer(2016), когда я задаю поле фильтра Date_Document в своем запросе, которое я получаю "не удалось разобрать строку временного усилителя SQL" Исключение.

Кстати: тип данных Date_Document равен datetime.

procedure TfrmMain.fltDateEdt2Change(Sender: TObject);
var dat1,dat2:TSQLTimeStamp;
begin
if (fltDateEdt1.Text<>'  /  /    ') and (fltDateEdt2.Text<>'  /  /    ') then
 begin
 if fltDateEdt1.Date<fltDateEdt2.Date then
  try
   dat1:=DateTimeToSQLTimeStamp(fltDateEdt1.Date);
   dat2:=DateTimeToSQLTimeStamp(fltDateEdt2.Date);
   comps.qryMain.Filter:=format('%s>= %s AND %s<=%s',  ['DATE_DOCUMENT',SQLTimeStampToStr('YYYY-MM-DD',dat1).QuotedString,'DATE_DOCUMENT',SQLTimeStampToStr('YYYY-MM-DD',dat2).QuotedString]);
comps.qryMain.Filtered:=true;
  except

  end;
  end
else
  begin
  comps.qryMain.Filtered:=false;
  comps.qryMain.Filter:='';
  end;
end;

1 Ответ

0 голосов
/ 12 июня 2018

Я бы использовал escape-последовательности в таком случае.Как, например, (при условии, что столбец DATE_DOCUMENT имеет тип данных DATETIME , как вы упомянули):

comps.qryMain.Filter := Format('DATE_DOCUMENT >= {dt %s 00:00:00} AND DATE_DOCUMENT <= {dt %s 23:59:59}', [
  FormatDateTime('yyyy-mm-dd', fltDateEdt1.Date),
  FormatDateTime('yyyy-mm-dd', fltDateEdt2.Date)
]);

Смысл создания такогоСтрока фильтра заключается в том, что вы позволяете FireDAC преобразовывать описанный формат даты и времени в собственный формат СУБД, заменяя только часть даты с указанным временем даты в указанном формате.

Что еще лучше, я бы просто написал обработчик для OnFilterRecord событие.

...