SQL查询在Workbench中工作,但在Delphi中使用完全相同的查询得到“无法转换变体类型”错误

时间:2014-04-22 20:39:39

标签: sql delphi workbench

我得到的确切错误是

  

无法将类型(UnicodeString)的变体转换为类型(日期)。

我用于日期的变量是一个字符串,我必须在它周围放置引号,否则它返回null但是当我在它周围加上引号时我得到了这个错误。

这是我的SQL Query和变量TodaysDate的代码。 (此代码无法复制和粘贴,因为它位于不具备互联网功能的其他计算机上,因此请忽略可能导致编译错误的任何内容)

    if MidStr(DateToStr(Date),2,1) ='/' then
         TodaysDate := MidStr(DateToStr(Date),6,4) + '-' + '0' + 
         MidStr(DateToStr(Date),1,1) + '-' + MidStr(DateToStr(Date),3,2)
    else
      TodaysDate := MidStr(DateToStr(Date),7,4) + '-' 
      + MidStr(DateToStr(Date),1,2) + '-' + MidStr(DateToStr(Date),4,2);

   ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('SELECT tbl.emailAddress, tbljob.Time FROM '+
   'dbwindowwash.tblclient, dbwindowwash.tbljob, dbwindowash.tbljobclientworker '+
   'WHERE tbljobclientworker.jobID = tbljob.jobID AND '+
   'tbljobclientworker.clientID = tblclient.clientID AND tbljob.Date = ' +
   QuotedStr(TodaysDate));
   ADOQuery1.Open

   // More Code using the email addresses and time

直接复制并粘贴到Workbench这个查询给了我想要的所有数据,但在Delphi中给了我和错误,没有QuotedStr()它在Delphi和Workbench中都返回null。

我在其他地方的程序中有一个类似的查询,它使用日期作为QuotedStr()的字符串,它运行正常,所以我完全不知道这有什么问题。

2 个答案:

答案 0 :(得分:6)

同意SirRufo的评论。正确答案"我该怎么做?"是不是那样做的;这是错误的做法。"

如果您将值直接粘贴到查询中,黑客可以找到place things into your query that get interpreted as SQL commands.的方法这称为 SQL注入,并且它负责数十亿美元'在过去的几十年中损失惨重。 (不夸张。)

正确的方法是将SQL代码与数据完全分开,方法是使用参数

ADOQuery1.SQL.Clear;

//: before an identifier specifies a parameter
ADOQuery1.SQL.Add('SELECT tbl.emailAddress, tbljob.Time FROM '+
  'dbwindowwash.tblclient, dbwindowwash.tbljob, dbwindowash.tbljobclientworker '+
  'WHERE tbljobclientworker.jobID = tbljob.jobID AND '+
  'tbljobclientworker.clientID = tblclient.clientID AND tbljob.Date = :date';

//parse the query and find parameter declarations
ADOQuery1.Prepare;

//set a value for the parameter
ADOQuery1.ParamByName['date'].AsDateTime := TodaysDate;

ADOQuery1.Open

如何设置参数值的确切语法可能因数据集类型而异,但这应该为您提供基本的想法。

答案 1 :(得分:1)

如果您希望日期在SQL查询中正常工作,请不要自己嬉戏,而是使用以下格式:yyyymmdd。

例如,2014年4月3日成为:20140403。

在您的情况下,您可以使用FormatDateTime轻松完成此操作:

TodaysDate := FormatDateTime('yyyymmdd', Date)

此日期符号符合iso标准,您不必再考虑本地设置了。

相关问题