"> "> " />

SQlite क्वेरी 1000s में पूर्णांक चुनते समय काम नहीं कर रही है

मैं अपने डेटाबेस के रूप में सी #, विनफॉर्म, एसक्यूलाइट का उपयोग कर रहा हूं।

मैं निम्न क्वेरी चला रहा हूं:

string sql14 = "select YYMM, TotalTrans  from t2 where CAST(TotalTrans as int) < 500000 and CAST(TotalTrans as int) > 1000";

मैं फिर 2 सूचियों को पॉप्युलेट करने के लिए इस क्वेरी का उपयोग करता हूं, जिसे मैं फिर मेनस्ट्रिप पर निर्यात करता हूं जहां उपयोगकर्ता इसे इस तरह चुन सकता है:

string sql14 = "select YYMM, TotalTrans  from t2 where CAST(TotalTrans as int) <  500000 and CAST(TotalTrans as int) > 1000";
SQLiteCommand cmd5 = new SQLiteCommand(sql14, sqlite_conn);


SQLiteDataReader rdr5 = cmd5.ExecuteReader();

while (rdr5.Read())
{

  int TotalTranst22;
  DateTime yyyymmt22;

  if (DateTime.TryParse(rdr5["YYMM"].ToString(), out yyyymmt22) && int.TryParse(rdr5["TotalTrans"].ToString(), out TotalTranst22))
  {
     //Populating the lists

      YYMMt22.Add(yyyymmt22);
      TotalTransIrregularitiest22.Add(TotalTranst22);
  }
}

Problem: When I select the option to show the contents of the 2 lists YMMt22 and TotalTransIrrefularitiest22, nothing happens. While trying to debug I found out that the lists are completely empty, i.e: the query isn't working.

अपडेट:

The problem arises when I try to run the query for values > 1000, as they have a ',' in them.

साथ ही, उपयोगकर्ता सुझाव (नीचे) की कोशिश करते समय

SELECT CAST(TotalTrans as int) FROM t2`

मुझे एक त्रुटि मिल रही है कि इंडेक्स मेरे अगर कथन की स्थिति में सरणी के सीमा से बाहर था

यहां वास्तविक डेटा है जिसे मैं क्वेरी के माध्यम से सूचियों में स्टोर करने का प्रयास कर रहा हूं। जैसा कि आप देख सकते हैं, इसमें हजारों विभाजक (अल्पविराम) हैं।

enter image description here


Just for the record: I know this process of querying my table works because I used a similar query to get values <1000 (notice they dont have a ',') and it worked perfectly. Here's the code for that:

// Total Trans tolerance <1000

string sql13 = "select YYMM, TotalTrans  from t2 where cast(TotalTrans as int) < 1000";

अपडेट:

उपयोगकर्ता समाधान का प्रयास किया ... अभी भी कोई भाग्य नहीं है। सूचियों को किसी भी डेटा से भरा नहीं है

    string sql14 = "select YYMM, TotalTrans  from t2 where CAST(REPLACE(TotalTrans, ',', '') as int) < 500000 and CAST(REPLACE(TotalTrans, ',', '') as int) > 1000";
        SQLiteCommand cmd5 = new SQLiteCommand(sql14, sqlite_conn);


        SQLiteDataReader rdr5 = cmd5.ExecuteReader();

        while (rdr5.Read())
        {

            int TotalTranst22;


            DateTime yyyymmt22;
            if (DateTime.TryParse(rdr5["YYMM"].ToString(), out yyyymmt22) && int.TryParse(rdr5["TotalTrans"].ToString(), out TotalTranst22))
            {
                YYMMt22.Add(yyyymmt22);
                TotalTransIrregularitiest22.Add(TotalTranst22);
            }
        }
0
खेद है कि पूरी तरह से अपनी पोस्ट को गलत तरीके से पढ़ाएं, मुझे जांचने दें
जोड़ा लेखक Newuser, स्रोत
ठीक है: जब मैं आपकी क्वेरी चलाता हूं तो मुझे त्रुटि मिलती है: मेरे मूल पोस्ट में अगर कथन में इंडेक्स सरणी की सीमा से बाहर था .. दिलचस्प
जोड़ा लेखक Newuser, स्रोत
एक अन्य कुंजी खोज: आप ',' कुछ भी> 1000 के बारे में सही थे (अल्पविराम विभाजक के साथ मूल्य मेरी क्वेरी से कोई मान नहीं लौटाता
जोड़ा लेखक Newuser, स्रोत
कुल स्ट्रिंग एक स्ट्रिंग है? हो सकता है कि यह शून्य हो, यदि स्ट्रिंग में ',' जैसे गैर-संख्यात्मक वर्ण होते हैं? क्या होता है यदि आप टी 2` से सीएएसटी (int के रूप में कुल ट्रान्स) चुनें? क्या यह आपके द्वारा अपेक्षित पूर्णांक, या नल का गुच्छा भी लौटाता है?
जोड़ा लेखक oerkelens, स्रोत
कास्ट "स्पष्ट रूप से" काम करता है? तो फिर आपको समस्या क्यों है? मानों के लिए <1000 आपके पास नहीं है, 'वहां', तो यह काम करेगा, हां। जब मैंने पूछा कि आप क्या चुनते हैं तो आपको क्या मिलता है?
जोड़ा लेखक oerkelens, स्रोत

5 उत्तर

निम्न की तरह कुछ आज़माएं, मेरे पास अभी उपलब्ध स्क्लाइट नहीं है, इसलिए इसे थोड़ी सी चिमटा की आवश्यकता हो सकती है ...

संपादित करें: मैंने बाद में देखा कि यद्यपि आप WHERE खंड में एक int में परिवर्तित हो रहे हैं, आप कुल ट्रान्स के टेक्स्ट संस्करण को चुन रहे हैं जिसमें अल्पविराम होगा। यह आपके int.TryParse असफल होने का कारण बन रहा है। निम्न का प्रयास करें, यह TryParse के संस्करण का उपयोग करता है जो एक प्रारूपप्रदाता लेता है और अल्पविराम से निपट सकता है ...

string sql14 = "select YYMM, TotalTrans  from t2 where CAST(REPLACE(TotalTrans, ',', '') as int) < 500000 and CAST(REPLACE(TotalTrans, ',', '') as int) > 1000"

SQLiteCommand cmd5 = new SQLiteCommand(sql14, sqlite_conn);
    SQLiteDataReader rdr5 = cmd5.ExecuteReader();

    while (rdr5.Read())
    {
        int TotalTranst22;
        DateTime yyyymmt22;
        if (DateTime.TryParse(rdr5["YYMM"].ToString(), out yyyymmt22) && int.TryParse(rdr5["TotalTrans"].ToString(), NumberStyles.Number, CultureInfo.CurrentCulture, out TotalTranst22))
        {
            YYMMt22.Add(yyyymmt22);
            TotalTransIrregularitiest22.Add(TotalTranst22);
        }
    }

ध्यान दें कि यह आपको एक अल्पकालिक समाधान प्राप्त करता है लेकिन आपको यह पूछने की आवश्यकता है कि आपकी स्कीमा को स्ट्रिंग डेटा प्रकार में पहले स्थान पर रखने के लिए क्यों परिभाषित किया गया है।

3
जोड़ा
एक सप्ताह के बाद, बहुत निराशा, और चिंता, धन्यवाद, !!!!!!!!!!!!!! आप सही मायने में बक्षीस का दावा कर सकते हैं। मदद की हर किसी के लिए एक बड़ा धन्यवाद !!
जोड़ा लेखक Newuser, स्रोत
@dazedandconfused मुझे त्रुटि मिलती है: कोशिश पार्स के लिए कोई ओवरलोडेड विधि 3 तर्क नहीं लेती है। वैश्वीकरण नामक संस्कृतिइफो के लिए नामस्थान भी है? आपकी मदद के लिए बहुत धन्यवाद
जोड़ा लेखक Newuser, स्रोत
यह काम नहीं करता है :(
जोड़ा लेखक Newuser, स्रोत
@LS_dev मेरी अद्यतन पोस्ट की जांच करें, अभी भी कोई भाग्य नहीं है। सूचियों को डेटा से भरा नहीं है। मैं सूची से शुरुआत में int डेटा में कनवर्ट करने की सोच रहा हूं
जोड़ा लेखक Newuser, स्रोत
@ न्यूससर +1 यह समाधान क्यों काम नहीं करता है? यह सही है। विशेष रूप से दूसरा अनुच्छेद!
जोड़ा लेखक LS_ᴅᴇᴠ, स्रोत
क्या आप विस्तार से समझा सकते हैं? क्या आपको कोई त्रुटि हो रही है या सिर्फ कोई डेटा नहीं है? आप इसे अधिक सुचारु रूप से जाने के लिए एक एसकफ्लिडल पोस्ट करने पर विचार कर सकते हैं।
जोड़ा लेखक dazedandconfused, स्रोत
मैं स्मृति से जा रहा था और एक पैरामीटर छोड़ दिया, कोड संपादित किया गया है। हां, सिस्टम। ग्लोबलाइजेशन सही नेमस्पेस है।
जोड़ा लेखक dazedandconfused, स्रोत

टिप्पणियों और आपके स्क्रीनशॉट के आधार पर, ऐसा लगता है कि आपका कॉलम एक स्ट्रिंग है और 'संख्या' पहले से ही अल्पविरामों के साथ स्वरूपित हैं।

यदि आपको अपनी स्कीमा को संशोधित करने की अनुमति है, तो शायद आपको ऐसा करने पर विचार करना चाहिए। स्ट्रिंग कॉलम का उपयोग क्यों करें यदि आप केवल वहां संख्यात्मक डेटा संग्रहीत कर रहे हैं?

यदि आपको अनुमति नहीं है, तो आप समस्या को उत्पन्न करने वाले अल्पविरामों को हटाकर, कॉलम पर प्रतिस्थापित टेक्स्ट को करने का प्रयास कर सकते हैं। फ़ंक्शन को प्रतिस्थापित करें पर एक नज़र डालें और निकालने के लिए अल्पविराम को खाली स्ट्रिंग के साथ बदलने के लिए इसका उपयोग करें उन्हें।

2
जोड़ा
मैं वास्तव में एक प्रतिस्थापन समारोह कैसे जोड़ूँगा? वाक्यविन्यास के साथ मेरा मतलब है। इसके अलावा सभी डेटा सूचियों से आता है जो प्रारंभिक तार हैं, क्या आपको लगता है कि उन सूचियों को शुरू में int में बदलने की कोशिश करना प्रारंभ में मदद करेगा?
जोड़ा लेखक Newuser, स्रोत
बढ़िया मैं सबकुछ ध्यान में रखूंगा, इसका परीक्षण करूँगा फिर एक उत्तर thx चिह्नित करें
जोड़ा लेखक Newuser, स्रोत
यह एकमात्र साईं जवाब है।
जोड़ा लेखक l33t, स्रोत
उदाहरण पर एक नज़र डालें कि @dazedandconfused ने REPLACE फ़ंक्शन का उपयोग करने के बारे में पोस्ट किया है। और निश्चित रूप से यदि आप डाटाबेस में डेटा को अपने सही डेटा प्रकार में परिवर्तित कर सकते हैं तो यह बहुत अच्छा होगा (प्रदर्शन कारणों, सही सॉर्टिंग आदि के लिए भी)।
जोड़ा लेखक Nikolaos Georgiou, स्रोत

आपकी समस्या यहाँ है

if (DateTime.TryParse(rdr5["YYMM"].ToString(), out yyyymmt22) && int.TryParse(rdr5["TotalTrans"].ToString(), out TotalTranst22))

int.TryParse असफल रहा है। याद रखें कि आप स्ट्रिंग मान का चयन कर रहे हैं और फिर इसे int में परिवर्तित करने का प्रयास कर रहे हैं। काम करने के लिए आपकी पूछताछ के लिए आपको इसे बदलने की जरूरत है

select YYMM, REPLACE(TotalTrans, ',', '')  from t2 where CAST(REPLACE(TotalTrans, ',', '') as int) < 500000 and CAST(REPLACE(TotalTrans, ',', '') as int) > 1000";

अन्यथा अगर स्थिति में ट्रांसवैल्यू '336,604' और int.TryParse() की तरह कुछ विफल हो जाएगा।

उम्मीद है की यह मदद करेगा।

1
जोड़ा

मेरे पास स्क्लाइट नहीं है, मैं इस कोड को आजमाने के लिए एसक्यूएल सर्वर का उपयोग करता हूं, शायद आपकी मदद कर सकता है:

1। अगर कुल स्ट्रिंग एक स्ट्रिंग

  • आपको खाली स्ट्रिंग
  • को ',' को प्रतिस्थापित करना होगा

2। अगर कुल ट्रान्स हेव दशमलव ('।') - 2.15

  • आपको फ्लोट
  • में कनवर्ट करना होगा

select 
    convert(float, replace(TotalTrans,',',''))
from
(
    select '336,604' as TotalTrans 
    union all
    select '329,548' as TotalTrans 
    union all
    select '2,734,311' as TotalTrans 
    union all
    select '2.15' as TotalTrans -- [done] with convert to float
    union all
    select '4' as TotalTrans 
    union all
    select '78' as TotalTrans 
    union all
    select '' as TotalTrans -- [done] automatic replace to 0
    union all
    select null as TotalTrans -- [done] no record
) a
where cast(replace(TotalTrans,',','') as float) < 1000 

परिणाम :

--------
|2.15  |
--------
|4     |
--------
|78    |
--------
|0     |
--------
1
जोड़ा
कनवर्ट SQLite में उपलब्ध नहीं है।
जोड़ा लेखक LS_ᴅᴇᴠ, स्रोत
CONVERT को CAST CAST (REPLACE (TotalTrans, ',', '') को फ्लोट के रूप में बदलने का प्रयास करें)
जोड़ा लेखक penjepitkertasku, स्रोत

हम जानते हैं कि 999 से अधिक पूर्णांक में 4 या अधिक अंक होंगे।

SELECT YYMM, TotalTrans FROM t2 WHERE length(TotalTrans) > 3;

आप दो खंड बाधा के बजाय BETWEEN वाक्यविन्यास भी आज़मा सकते हैं।

 SELECT YYMM, TotalTrans FROM t2 WHERE CAST(replace(TotalTrans,',','') BETWEEN 1000 AND 500000;

यह एक बार रूपांतरण होने के लिए मजबूर करेगा, जो किसी भी अस्थायी तालिकाओं के उपयोग को रोक सकता है।

जैसा कि अन्य ने कहा है, आपकी समस्या उस पूर्णांक के पाठ प्रतिनिधित्व में निहित है। आप शायद इसके बारे में जानते हैं, लेकिन आप इसे एक व्यापारिक मानते हैं; हालांकि, डेटाबेस डेटा संग्रहित करने के लिए हैं, और आपके अनुप्रयोग इसे पेश करने के लिए हैं। सी # को आपके लिए संख्या स्वरूपण करने दें।

3 अंकों के समूह में संख्यात्मक कैसे प्रदर्शित करें

और अपनी मेज को ठीक करने के लिए।

UPDATE t2 SET TotalTrans = CAST(replace(TotalTrans,',','') AS INTEGER);

याद रखें, SQLite प्रति फ़ील्ड आधार पर टाइप एफ़िनिटी का उपयोग करता है, इसलिए आपको अपनी स्कीमा को अपडेट करने की आवश्यकता नहीं है - मैं आपको सलाह देता हूं कि आप ऐसा करते हैं।

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

1
जोड़ा
क्या कोई ऐसी सेवा है जहां हम स्क्रीन साझा कर सकते हैं? मैं नया हूं और इसे चलाने के बारे में बहुत कुछ नहीं जानता
जोड़ा लेखक Newuser, स्रोत
मैं आपके दृष्टिकोण की कोशिश करने जा रहा हूँ। मैंने पहली क्वेरी की कोशिश की लेकिन मुझे सभी मान मिल रहे हैं <1000 यदि मैं कुल ट्रान्स> 3 .. बहुत अजीब हूं
जोड़ा लेखक Newuser, स्रोत
न्यूसर, क्या आपने SQLite के लिए कमांड लाइन टूल का उपयोग करके अपने प्रश्नों का परीक्षण किया है? sqlite.org/download.html विंडोज के लिए प्रीकंपिल्ड बाइनरीज़ के अंतर्गत देखें/ sqlite-shell
जोड़ा लेखक Arik, स्रोत
न्यूसर, ऐसा नहीं है कि मैं अपने कार्यालय में उपयोग कर सकता हूं, लेकिन उपकरण बहुत आसान है। डाउनलोड करें, निकालें, और सी: \ विंडोज \ system32 पर कॉपी करें। एक कमांड प्रॉम्प्ट खोलें, cd निर्देशिका में जहां आपका डेटाबेस संग्रहीत है, sqlite3 datafile दर्ज करें, जहां datafile आपके डेटाबेस का फ़ाइल नाम है। वहां से आप प्रश्न चला सकते हैं। उपकरण का आनंद लें, मैं इसे दैनिक उपयोग करता हूं।
जोड़ा लेखक Arik, स्रोत