作者:大胡子姐姐爱油面巾塞肉 | 来源:互联网 | 2023-01-31 11:02
使用Delphi 10.2,SQLite和Teecharts.我的SQLite数据库有两个字段,创建时间:
CREATE TABLE HistoryRuntime ('DayTime' DateTime, Device1 INTEGER DEFAULT (0));
我使用带有以下SQL 的TFDQuery
调用来访问表qryGrpahRuntime
:
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中的Field Editor,我可以添加两个持久字段,TheDate
即a as TDateTimeField
和DeviceTotal
a TLargeIntField
.
我在程序中运行此查询以创建我在设计时创建的TeeChart.只要查询返回一些记录,所有这些都有效.但是,如果请求的日期没有记录,我会收到一条EDatabaseError
消息:
qryGrpahRuntime:字段'DeviceTotal'的类型不匹配,期望:LargeInt actual:Widestring
我已经在网上搜索了大量关于如何在空查询中防止此错误的解决方案,但是我找不到任何好运.据我所知,当没有返回数据时,SQLite默认为宽字符串字段.我已经尝试在查询中使用CAST,它似乎没有任何区别.
如果我删除持久字段,查询将在空返回集上打开而没有问题.但是,为了在IDE中使用TeeChart编辑器,我看来需要持久字段.
有没有办法让我可以使用持久字段,或者我将不得不丢弃持久字段,然后在运行时添加TeeChart系列?
1> Victoria..:
FireDAC的SQLite手册中的调整FireDAC映射章节中描述了此行为:
对于SELECT列表中的表达式,SQLite避免使用类型名称信息.当结果集不为空时,FireDAC使用第一个记录中的值数据类型.为空时,FireDAC将这些列描述为dtWideString.要显式指定列数据类型,请附加::
到列别名:
SELECT count(*) as "cnt::INT" FROM mytab
所以修改你的命令,例如这样(我使用BIGINT,但你可以使用映射到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)
PS我通过使用BETWEEN运算符(仅对列值进行一次计算)进行了一次小的优化,并使用了一个转义序列来表示日期常量(实际上你用参数替换,我猜;这只是为了好奇).
此数据类型提示由FDSQLiteTypeName2ADDataType过程解析,该过程在其AColName参数中采用并解析格式为 :: 的列名称.