Two*_*ice 3 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
Run Code Online (Sandbox Code Playgroud)
直接复制并粘贴到Workbench这个查询给了我想要的所有数据,但在Delphi中给了我和错误,没有QuotedStr()它在Delphi和Workbench中都返回null.
我在其他地方的程序中有类似的查询,它使用日期作为字符串,QuotedStr()它工作正常,所以我完全不知道这有什么问题.
同意SirRufo的评论.正确回答"我该怎么办?" 是"不要这样做;这是错误的做法."
如果您将值直接粘贴到查询中,黑客可以找到一种方法将事物放入查询中,并将其解释为SQL命令. 这被称为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
Run Code Online (Sandbox Code Playgroud)
如何设置参数值的确切语法可能因数据集类型而异,但这应该为您提供基本的想法.