使用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
作为TDateTimeField
和DeviceTotal
作为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 参数。