2017-10-01 44 views
3

我有一個SQL語句綁定到SQLite3數據庫的TFDQuery。如果我執行下面的查詢,如果存在符合WHERE子句的行,它將正常工作。在這種情況下,MyMield是一個浮點數,當我使用字段編輯器預生成表格字段時,它會正確顯示爲TFloatField。但是,如果沒有匹配的行(空結果),則MyMaxField將作爲TWideStringField返回。這與我在設計時創建的字段對象類型不匹配,返回和錯誤(即使在設計時)。SQLite返回NULL集合函數的TWideStringField

SELECT max(MyField) AS MyMaxfield FROM MyTable WHERE MyOtherFfield=10 

我也嘗試使用鑄造max()到一個真正的,它仍然失敗。

的Delphi 10.2

+0

我想你需要從你的Delphi代碼中處理這個。如果結果是一個空集,那麼從SQLite方面可以做的事情就不多了。 –

回答

4

這在FireDAC的SQLite的手冊Adjusting FireDAC Mapping章中所描述:

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

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

因此,要解決您的問題只是爲你的表達式列指定數據類型。例如:

SELECT 
    MAX(MyField) AS "MyMaxfield::REAL" 
FROM 
    MyTable 
WHERE 
    MyOtherFfield = 10 
+0

是不是這個q&a基本上是https://stackoverflow.com/questions/44769558/tfdquery-and-sqlite-type-mismatch-for-field-expecting-largeint-actual-widest的副本? – MartynA

+0

@MartynA,解決方案是一樣的。其實,我在這裏鑄造了重複的近距離投票,並等了一會兒。由於沒有其他人投票,我收回併發布了答案。 [我想讓更老的問題更一般化](https://stackoverflow.com/review/suggested-edits/16741951),但我的編輯建議被拒絕了。所以,我現在有點困惑。我應該回答,投下近距離投票,還是讓更老的問題更籠統,並投下近距離投票? – Victoria

+0

嗯,我剛剛標記爲重複,顯然是成功的。但我很困惑,爲什麼你的編輯改善你的答案應該被拒絕,因爲顯然它應該更好地給出一個好的答案。爲什麼不再試一次,讓我知道,我會投票支持它? – MartynA