代码之家  ›  专栏  ›  技术社区  ›  Rick Hollerich

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

  •  2
  • Rick Hollerich  · 技术社区  · 7 年前

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

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

    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)
    

    TheDate 作为一个 TDateTimeField DeviceTotal TLargeIntField .

    EDatabaseError 消息异常:

    我已经在网上搜索了很多关于如何防止空查询出现这种错误的解决方案,但我没有找到任何解决方案。据我所知,当没有返回数据时,SQLite默认为宽字符串字段。我曾尝试在查询中使用CAST,但似乎没有任何效果。

    如果删除持久字段,查询将在空返回集上打开,不会出现问题。然而,为了在IDE中使用TeeChart编辑器,似乎需要持久字段。

    有没有一种方法可以在持久字段中实现这一点,或者我必须扔掉持久字段,然后在运行时添加TeeChart系列?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Victoria zac    7 年前

    Adjusting FireDAC Mapping FireDAC SQLite手册的章节:

    对于选择列表中的表达式,SQLite避免使用类型名 第一条记录中的数据类型。当为空时,FireDAC描述了这些 列作为dtWideString。要显式指定列数据类型, ::<type name>

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

    因此,修改您的命令,例如这样(我使用 BIGINT公司 pseudo data type 它映射到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)
    

    BETWEEN escape sequence 对于日期常数(我想,在实际中,您可以用参数替换它;出于好奇)。


    此数据类型提示由 FDSQLiteTypeName2ADDataType < 在its中 AColName公司