【问题标题】:load data from database on date selection在日期选择时从数据库加载数据
【发布时间】:2012-08-06 00:28:34
【问题描述】:

我正在尝试使用 dbplannercalender1 加载数据库数据。

procedure TForm1.DBPlannerCalendar1DaySelect(Sender: TObject;
  SelDate: TDateTime);
begin
with absQuery2 do
begin
  absQuery2.Close;
  absQuery2.sql.Clear;
  ABSQuery2.SQL.Text:='select * from log where date = :a1';
  ABSQUERY2.PARAMS.ParamByName('a1').value:= DBPlannerCalendar1.Date;
  ABSQuery2.ExecSQL;
end;
end;

我收到错误“预期的日期字符串”YYYY-MM-DD”,但“=”在第 1 行找到...” 我做错了什么?

【问题讨论】:

  • 您连接的是哪种 SQL 服务器?数据库服务器? MySQL?看起来“日期”有一些特殊含义,而您希望它引用日志表的列。日志表的架构是什么?也许尝试 log.date 而不是 date?

标签: delphi-xe2 delphi-xe


【解决方案1】:

使用截断值 adoQuery.Parameters.paramByName('DataDal').value := trunc(edDate.Date);

【讨论】:

    【解决方案2】:

    使用AsDateTime而不是Value,让驱动程序将其转换为正确的格式:

    AbsQuery2.Params.ParamByName('a1').AsDateTime := DBPlannerCalendar1.Date;
    

    如果 Absolute 由于某种原因不支持AsDateTime,请自行格式化日期:

    AbsQuery2.Params.ParamByName('a1').Value := 
        FormatDateTime('yyyy-mm-dd`, DBPlannerCalendar1.Date);
    

    第一种方法是最好的选择,因为它在数据库引擎之间更便于移植(它适用于所有引擎,因为驱动程序将格式设置为日期的正确排列)。使用第二个意味着如果数据库需要不同于 YYYY-MM-DD 的内容,您必须在所有使用日期的地方更改代码。

    【讨论】:

    • 那么您并没有发布您的实际 SQL 文本,因为那里没有错误。 (不过,FormatDateTime 日期格式的第二个示例中存在错误,我已修复。)您尝试了我发布的两种解决方案中的哪一种?
    • ABSQUERY2.PARAMS.ParamByName('a1').Value := FormatDateTime('YYYY-MM-DD', DBPlannerCalendar1.Date);不起作用。我仍然遇到同样的错误。
    • 试试我给你的第一个选项(我说你应该首先选择的那个,并在我的最后一段中解释了为什么你应该选择它)。 AbsQuery2.Params.ParamByName('a1').AsDateTime 而不是 Value
    • 然后发布您的真实 SQL,因为您在问题中发布的不是它。您问题中的 SQL 不会在我发布的任何一个版本的代码中引发该异常,因此您没有发布真正的查询文本。
    • 真实是什么意思?这就是所有的代码。我想要的只是根据 DBPlannerCalendar1 中选择的日期从数据库中获取数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2020-06-30
    • 2017-12-20
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多