tfdquery and sqlite:键入字段不匹配,期望:大键实际:宽度



使用delphi 10.2,sqlite和teecharts。我的sqlite数据库有两个字段,其中创建了:

CREATE TABLE HistoryRuntime ('DayTime' DateTime, Device1 INTEGER DEFAULT (0));

i使用TFDQuery访问该表,称为qryGrpahRuntime与以下SQL:

SELECT DayTime AS TheDate, Sum(Device1) As DeviceTotal
FROM HistoryRuntime 
WHERE  (DayTime >= "2017-06-01") and (DayTime <= "2017-06-26") 
Group by Date(DayTime)

使用Delphi IDE中的字段编辑器,我可以添加两个持久字段,将TheDate作为TDateTimeFieldDeviceTotal作为TLargeIntField

我在程序中运行此查询,以创建我在设计时创建的Teechart。只要查询返回一些记录,所有这些都可以。但是,如果没有要求的日期记录,我会得到一条消息的EDatabaseError例外:

qrygrpahruntime:为" devicettal"字段键入不匹配,期待:大键实际:widestring

我已经在网络上搜索了有关如何在空查询中预防此错误的解决方案,但是我发现任何东西都没有运气。据我所知,当没有返回数据时,SQLITE默认为宽字符串字段。我尝试在查询中使用铸件,但似乎没有任何区别。

如果我删除了持久字段,则查询将在空返回集中打开而不会出现问题。但是,为了在IDE中使用Teechart编辑器,看来我需要持久字段。

有没有一种方法可以通过持久字段进行这项工作,还是我必须抛出持久字段,然后在运行时添加Teechart系列?

中描述了FireDac映射 firedac sqlite手册的章节:

对于选择列表中的表达式,sqlite避免了类型名称 信息。当结果集不是空的时,FireDac使用该值 来自第一个记录的数据类型。空中时,FireDac描述了 列为dtwidestring。要明确指定列数据类型, 将::<type name>附加到列别名:

SELECT count(*) as "cnt::INT" FROM mytab

因此,修改您的命令,例如这样(我使用 bigint ,但是您可以使用任何 pseudo数据类型将映射到64位签名的整数数据类型而不是自动增量,这与您的相对应持续 tlargeintfield 字段(:

SELECT
   DayTime AS "TheDate",
   Sum(Device1) AS "DeviceTotal::BIGINT"
FROM
   HistoryRuntime 
WHERE
   DayTime BETWEEN {d 2017-06-01} AND {d 2017-06-26}
GROUP BY
   Date(DayTime)

P.S。我通过在 operator之间使用进行了小的优化(该仅评估列值一次(,并使用 easse> easce sepence 用于日期常数(实际上,实际上您替换为参数,,我猜是;所以只是为了好奇(。


此数据类型提示通过 fdsqlitetypename2Addatate protipture conteral >&lt;列名称&gt; :: :: :: type&gt; ::strong> acolname 参数。

相关内容

  • 没有找到相关文章

最新更新