为什么我的查询不起作用?
Form1.ABSQuery1.Close;
Form1.ABSQuery1.SQL.Clear;
Form1.ABSQuery1.SQL.Text:='DELETE FROM LOG WHERE status = ''YES'' and DATE BETWEEN :d1 and :d2';
Form1.ABSQuery1.Params.ParamByName('d1').Value :=cxDateEdit1.Date;
Form1.ABSQuery1.Params.ParamByName('d2').Value :=cxDateEdit2.Date;
Form1.ABSQuery1.ExecSQL;
Form1.ABSTable1.Refresh;
我收到此错误:
答案 0 :(得分:1)
您应该在AsDateTime
设置代码中使用Params
。
Form1.ABSQuery1.SQL.Text:='DELETE FROM LOG WHERE status = ''YES'' and DATE BETWEEN :d1 and :d2';
Form1.ABSQuery1.Params.ParamByName('d1').AsDateTime :=cxDateEdit1.Date;
Form1.ABSQuery1.Params.ParamByName('d2').AsDateTime :=cxDateEdit2.Date;
Form1.ABSQuery1.ExecSQL;
使用Value
将cxDateEdit1.Date
转换为通用字符串格式以进行分配,但这并未将其正确转换为大多数数据库(包括ABS)所期望的YYYY-MM-DD
格式。正确使用AsDateTime
允许数据库驱动程序/组件转换为DBMS使用的特定日期格式。
此外,您的数据库字段是否真的命名为DATE
?在大多数DBMS中,日期通常是保留字或函数名称,如果是,通常需要引用它。
答案 1 :(得分:0)
Form1.ABSQuery1.Params.ParamByName('d1').DataType := ftDateTime;
Form1.ABSQuery1.Params.ParamByName('d1').Value :=cxDateEdit1.Date;
你必须明确指定参数的数据类型才没有这样的问题,然后转换为字符串不需要