Delphi TFDQuery和SQLite:字段的类型不匹配,应为:LargeInt-actual:WideString

Delphi TFDQuery和SQLite:字段的类型不匹配,应为:LargeInt-actual:WideString,delphi,sqlite,teechart,firedac,delphi-10.2-tokyo,Delphi,Sqlite,Teechart,Firedac,Delphi 10.2 Tokyo,使用Delphi10.2、SQLite和Teecharts。我的SQLite数据库有两个字段,创建时使用: CREATE TABLE HistoryRuntime('day'日期时间,设备1整数默认值(0)); 我使用名为qryGrpahRuntime的TFDQuery和以下SQL访问表: 选择Dayer作为Date,选择Sum(设备1)作为DeviceTotal 从HistoryRuntime 其中(日间>=“2017-06-01”)和(日间该行为在FireDAC的SQLite手册的章节中描

使用Delphi10.2、SQLite和Teecharts。我的SQLite数据库有两个字段,创建时使用:

CREATE TABLE HistoryRuntime('day'日期时间,设备1整数默认值(0));
我使用名为
qryGrpahRuntime
TFDQuery
和以下SQL访问表:

选择Dayer作为Date,选择Sum(设备1)作为DeviceTotal
从HistoryRuntime

其中(日间>=“2017-06-01”)和(日间该行为在FireDAC的SQLite手册的章节中描述:

对于选择列表中的表达式,SQLite避免使用类型名称 信息。当结果集不为空时,FireDAC使用该值 第一条记录中的数据类型。为空时,FireDAC描述这些数据类型 列作为dtWideString。要显式指定列数据类型, 向列别名追加

从mytab中选择count(*)作为“cnt::INT”

因此,可以这样修改您的命令(我使用了BIGINT,但您可以使用映射到64位有符号整数数据类型且不是自动递增的任何类型,这与您的持久字段相对应):

选择
白天被称为“TheDate”,
总和(Device1)为“DeviceTotal::BIGINT”
从…起
历史运行时
哪里
{d 2017-06-01}和{d 2017-06-26}之间的白天
分组
日期(日间)
另外,我使用操作符(只对列值求值一次)进行了一个小优化,并对日期常量使用了一个参数(我想,在实际中,您可以用参数替换它;出于好奇)



此数据类型提示由过程解析,该过程在其AColName参数中获取并解析格式为的列名。

请参见;没有列类型,因为结果列不是直接来自表列。显然,没有办法重写它。@CL,如果没有办法重写,那么列类型一旦查询打开,在我运行它之前,我能做些什么来判断查询是否为空?打开查询就是我得到错误的地方。我只需要知道查询是否为空,然后我就不能通过停止错误来打开TeeChart。仅供参考:我使用的是没有FireDAC插件的专业版o我没有FireDac要研究的源代码。您可以执行此查询(或更简单的查询)单独使用。@CL,这是我目前解决问题的方法。我只是为请求的日期选择Day值,然后在运行完整查询之前检查该值是否为空。这不是最好的方法,但我尝试过的其他方法都失败了,这至少对我的TeeChart表单有效。谢谢@Victoria,这很有效,不过,我不得不将其更改为Sum(Device1)作为“DeviceTotal::BIGINT”,以使其工作感谢您的反馈!已修复。我使用的是Pro版本,它没有FireDAC的源代码,因此需要大量搜索,最后是这里的问题。@Victoria:另一个我当时错过的一流答案,+1