2017-06-26 61 views
2

使用Delphi 10.2,SQLite和Teecharts。我的SQLite數據庫有兩個領域,具有創建:TFDQuery和SQLite:字段類型不匹配,期望:LargeInt actual:WideString

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

我訪問使用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:現場「DeviceTotal」類型不匹配,期待:LargeInt實際:WideString的

我已經在網上搜索了很多關於如何在空查詢中防止這個錯誤的解決方案,但是我沒有找到任何運氣。從我所知道的,當沒有數據返回時,SQLite默認爲寬字符串字段。我試圖在查詢中使用CAST,但似乎沒有任何區別。

如果我刪除持久字段,查詢將在空回調集上打開時沒有問題。但是,爲了在IDE中使用TeeChart編輯器,看起來我需要持久字段。

有沒有一種方法可以使這個工作與持久字段,或者我將不得不拋出持久字段,然後在運行時添加TeeChart系列?

+0

請參閱https://stackoverflow.com/a/32818322;沒有列類型,因爲結果列不直接來自表列。顯然,沒有辦法覆蓋它。 –

+0

@CL,所以如果在查詢打開後無法重寫列類型,那麼在我運行之前是否有任何可以做的事來判斷查詢是否爲空?打開查詢是我得到錯誤的地方。我只需要知道查詢是否爲空,那麼我可以不打開TeeChart,通過停止錯誤。 –

+0

供參考:我使用沒有FireDAC插件的專業版本,所以我沒有FireDac的源代碼來研究。 –

回答

4

此行爲是在FireDAC的SQLite的手冊Adjusting FireDAC Mapping章中所描述:

對於在SELECT列表中的表達式,SQLite的避免了鍵入名字 信息。當結果集不爲空時,FireDAC使用第一條記錄中的值 數據類型。如果爲空,FireDAC將這些 列描述爲dtWideString。要明確指定列數據類型, 追加::<type name>到列別名:

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

所以例如修改命令這種方式(我用BIGINT,但您可以使用映射到一個64位有符號整數數據類型,而不是自動遞增,這相當於你的持久TLargeIntField場任意pseudo data type):

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過程,它接受和格式解析列名稱解析<列名> :: <類型名稱>在其AColName參數。

+0

Thanks @Victoria,that works,但是我確實必須將它改爲Sum(Device1)AS「DeviceTotal :: BIGINT」才能正常工作 –

+0

感謝您的反饋!固定。 – Victoria

+1

我使用Pro版本,它沒有與FireDAC的源代碼一起提供,因此很多搜索和最終的問題在這裏。 –