delphi TFDQuery और SQLite: फ़ील्ड के लिए प्रकार बेमेल लिखें, अपेक्षा: LargeInt वास्तविक: WideString



sqlite3 teechart (1)

डेल्फी 10.2, SQLite और Teecharts का उपयोग करना मेरे SQLite डेटाबेस के साथ बनाई गई दो फ़ील्ड हैं:

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

मैं निम्नलिखित एसक्यूएल के साथ TFDQuery नामक एक TFDQuery का उपयोग कर तालिका तक 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 रूप में प्राप्त कर रहा TLargeIntField

मैं इस प्रश्न को TeeChart बनाने के लिए एक प्रोग्राम में चलाता हूं, जिसे मैंने डिजाइन समय पर बनाया था। जब तक क्वेरी से कुछ रिकॉर्ड वापस आ जाता है, यह सब काम करता है हालांकि, यदि अनुरोधित तिथियों के लिए कोई अभिलेख नहीं है, तो मुझे संदेश के साथ एक EDatabaseError अपवाद मिलता है:

क्यूरीग्राहटटाइम: फ़ील्ड 'डिवाइसटोटल' के लिए प्रकार बेमेल लिखें, अपेक्षा कीजिए: बड़ी वस्तु: चौड़ाई

मैंने वेब पर समाधान की तलाश में बहुत कुछ किया है कि कैसे इस त्रुटि को एक खाली क्वेरी पर रोकने के लिए, लेकिन मैंने कुछ भी पाया जो कि भाग्य नहीं था। मैं जो बता सकता हूं, जब कोई डेटा वापस नहीं किया जाता है, तो विस्तृत स्ट्रिंग फ़ील्ड के लिए SQLite डिफ़ॉल्ट होता है। मैंने क्वेरी में CAST का उपयोग करने का प्रयास किया है और ऐसा कोई फ़र्क नहीं पड़ता।

यदि मैं लगातार फ़ील्ड को हटाता हूं, तो क्वेरी रिक्त वापसी सेट पर समस्याओं के बिना खुल जाएगी। हालांकि, IDE में TeeChart संपादक का उपयोग करने के लिए, ऐसा लगता है कि मुझे लगातार फ़ील्ड की आवश्यकता है

क्या ऐसा कोई तरीका है जो मैं लगातार इस क्षेत्र के साथ काम कर सकता हूं, या क्या मैं लगातार खेतों को फेंकने के लिए और फिर रनटाइम में TeeChart श्रृंखला जोड़ना होगा?


इस व्यवहार को FireDAC के SQLite मैनुअल के फायरडाक मानचित्रण अध्याय को समायोजित करने में वर्णित किया गया है:

एक SELECT सूची में एक अभिव्यक्ति के लिए, SQLite प्रकार नाम की जानकारी से बचा जाता है जब परिणाम सेट रिक्त नहीं होता है, तो FireDAC प्रथम डेटा से मूल्य डेटा प्रकारों का उपयोग करता है। जब खाली होता है, तो FireDAC उन स्तंभों को dtWideString के रूप में वर्णन करता है। स्तंभ डेटा प्रकार को स्पष्ट रूप से निर्दिष्ट करने के लिए ::<type name> जोड़ें: कॉलम उपनाम के लिए:

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

तो अपने आदेश को इस प्रकार संशोधित करें (इस तरह से मैं बड़ा उपयोग करता हूं, लेकिन आप किसी भी छद्म डाटा प्रकार का उपयोग कर सकते हैं, जो कि एक 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)

पीएस मैंने बिटवेन ऑपरेटर (जो केवल एक बार कॉलम मूल्य का मूल्यांकन करता है) का उपयोग करके एक छोटा अनुकूलन किया है, और दिनांक स्थिरांक के लिए एक एस्केप अनुक्रम का उपयोग किया है (जो वास्तविक में आप पैरामीटर द्वारा प्रतिस्थापित करते हैं, मुझे लगता है, तो बस जिज्ञासा के लिए)।

यह डेटा प्रकार इशारा FDSQLiteTypeName2ADDataType प्रक्रिया द्वारा पार्स किया जाता है जो प्रारूप में कॉलम नाम को लेता है <column name> :: <name name> इसके AColName पैरामीटर में