【问题标题】:Delphi & Absolute database : Delete QueryDelphi & Absolute 数据库:删除查询
【发布时间】:2013-06-18 22:28:50
【问题描述】:

为什么我的查询不起作用?

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;

我收到此错误:

【问题讨论】:

  • 什么不起作用?它不会删除您期望的记录吗?您是否收到 SQL 错误?您能否提供有关实际问题的更多信息
  • 如果用括号括起来会发生什么:(DATE BETWEEN :d1 and :d2)?
  • 可能是 DATE 被解释为一个函数? DATE 真的是您的某一列的名称吗?如果是这样,请将您的 DATE 字段重命名为其他名称,然后重试。
  • '从 LOG 中删除 status = ''YES'' and (DATE BETWEEN :d1 and :d2)'; - 没有任何内容被删除...

标签: delphi delphi-xe2 delphi-xe


【解决方案1】:

您应该在Params 设置代码中使用AsDateTime

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;

使用ValuecxDateEdit1.Date 转换为通用字符串格式以进行赋值,但这并不能正确地将其转换为大多数数据库(包括ABS)所期望的YYYY-MM-DD 格式。正确使用 AsDateTime 允许数据库驱动程序/组件转换为 DBMS 使用的特定日期格式。

另外,您的数据库字段是否真的命名为DATE?在大多数 DBMS 中,日期通常是保留字或函数名,如果是,通常需要加引号。

【讨论】:

  • 这让我困惑了一段时间,因为我起初使用的是 .asDate。看来,增加时间可以解决问题。
【解决方案2】:
Form1.ABSQuery1.Params.ParamByName('d1').DataType := ftDateTime;
Form1.ABSQuery1.Params.ParamByName('d1').Value :=cxDateEdit1.Date;

你必须显式指定参数的数据类型给它就没有这个问题了,然后转换成字符串就不需要了

【讨论】:

    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多