在SQL附加的Delphi 7中输入表达式不匹配

时间:2010-04-11 11:35:05

标签: sql delphi

我有一个代码,用于检查加载表单时的当前日期,执行简单的计算,并在Delphi中附加SQL。它适用于带有Delphi 7的Windows 7,另一台带有Xp的计算机,但不适用于其他3台带Xp的计算机。加载表单时,它会显示“表达式中的类型不匹配”,并指向追加后的行。可能是什么问题?

procedure TfmJaunumi.FormCreate(Sender: TObject);
var d1, d2: TDate; 

begin  
 d1:= Date;  
 d2:= Date-30;  
 With qrJaunumi do
     begin
         Open;
         SQL.Append('WHERE Sanem_datums BETWEEN' + #39 + DateToStr(d1) +
         #39 + 'AND' + #39 + DateToStr(d2) + #39);
         Active := True; 
     end; 
end;

5 个答案:

答案 0 :(得分:6)

正如robsoft所说,这可能是国际化设置。您可以使用参数化查询 - 如果使用日期和时间,它们通常更简单。

此外,不需要在with开头之后的Open - 事实上它将在没有你添加的WHERE子句的情况下打开查询。

 procedure TfmJaunumi.FormCreate(Sender: TObject);

 var d1, d2: TDate; 

 begin  d1:= Date;  d2:= Date-30;  With
 qrJaunumi do
         begin
         SQL.Append('WHERE Sanem_datums BETWEEN :StartDate AND :EndDate');
         // exact expression will vary according to DB connection type.
         // Example is for TADOQuery.
         Parameters.ParamByName('StartDate').Value := d1;
         Parameters.ParamByName('EndDate').Value := d2;
         Active := True; 
         end; 
 end;

答案 1 :(得分:4)

您可以使用预准备语句来克服日期时间值的任何本地化问题。 DateToStr取决于客户端。如果服务器的本地化不接受日期格式,FormatDateTime可能会失败。

procedure TfmJaunumi.FormCreate(Sender: TObject);
var
  d1, d2: TDate;
begin
  d1:= Date;
  d2:= Date - 30;
  //qrJaunumi.SQL.Clear; removed because it would remove the "SELECT ... FROM ..." part
  qrJaunumi.SQL.Add('WHERE Sanem_datums BETWEEN :StartDate AND :StopDate ');
  qrJaunumi.Prepared := True;
  qrJaunumi.ParamByName('StartDate').AsDateTime := d1;
  qrJaunumi.ParamByName('StopDate').AsDateTime := d2;
  qrJaunumi.Open; // = qrJaunumi.Active := True;
end;

“:StopDate”之后的空格非常重要,因为Delphi在参数解析器中有一个错误,除非他们在较新的版本中修复它。

答案 2 :(得分:3)

几乎可以肯定的是,这些计算机上的本地国际化设置 - DateToStr将返回本地日期格式的字符串(可能是MM / DD / YYYY或DD / MM / YYYY) - 并且取决于您的位置不是你期待的。

我怀疑你会发现它没有工作的电脑认为它们位于不同的国家/使用不同的国际化设置来处理它工作的电脑。

更好的解决方案是使用FormatDateTime将日期转换为SQL Server安装将接受的标准格式,因此任何本地“国际化”设置都不可能像这样干扰。

答案 3 :(得分:0)

不幸的是,上述方法都没有,但解决方案是用“yy.mm.dd”替换格式。而不是“yyyy.mm.dd。”,并添加单引号。很奇怪,它说格式为“yyyy.mm.dd”。到处。 代码现在看起来像这样:

procedure TfmJaunumi.FormCreate(Sender: TObject);
var d1, d2: TDate; d3, d4, atd: String;

begin
  d1:= Date;
  d3:= FormatDateTime('yy.mm.dd.',d1);
  d2:= Date-30;
  d4:= FormatDateTime('yy.mm.dd.',d2);
  atd := '''';
  With qrJaunumi do
    begin
      Open;
      SQL.Append('WHERE Sanem_datums BETWEEN'+ atd+d4+atd +'AND'+ atd+d3+atd+';');
      Active := True;
    end;
end;

答案 4 :(得分:0)

您好我有同样的错误,并从MS支持中找到了不同的解决方案:

SQL.Text:='从TableName中删除*其中((kno ='+(inttostr(userNo))+')和(Sanem_datums> =#'+(FormatDateTime('mm-dd-yy',d1) ))+'#))'; ExecSQL;

https://support.microsoft.com/en-us/kb/175258