2009-03-27 14 views
7

मेरे पास काम और कोड पर एक नया लैपटॉप है जो सप्ताह में पहले काम करता था आज काम नहीं करता है।सी # पार्स स्ट्रिंग "0" पूर्णांक

कोड कि पहले काम किया, सरलीकृत:

while (dr.Read()) 
{ 
    int i = int.Parse(dr.GetString(1)) 
} 

अब यह विफल रहता है जब डेटाबेस मूल्य 0. कभी कभी होता है, लेकिन नहीं मज़बूती से, इस के बजाय काम करेगा:

while (dr.Read()) 
{ 
    int i = Convert.ToInt32(dr["FieldName"])) 
} 

एम आई बेवकूफ कुछ याद आ रही है?

विचित्र रूप से पर्याप्त, ReSharper में एक ही त्रुटि संदेश के साथ कई अजीब त्रुटियां भी हैं जो मुझे उपरोक्त कोड के साथ मिल रही है: "इनपुट स्ट्रिंग सही प्रारूप में नहीं थी।" (इससे पहले कि मैं एक परियोजना भी लोड करता हूं।)

कोई विचार? कोई भी एसपी मुद्दे है? मैंने यह सुनिश्चित करने का प्रयास किया कि जब मेरे पास मशीन मिल जाए तो मेरे सभी एसपी अद्यतित थे।

संपादित करें: मैं समझता हूं कि Try.Parse और त्रुटि-प्रबंधन का उपयोग कैसे करें। यहां कोड सरल है। मैं डेटाबेस तालिका से टेस्ट केस पढ़ रहा हूं। इस कॉलम में केवल 0, 1, और 2 मान हैं। मैंने पुष्टि की है। मैंने इसे डेटाबेस फ़ील्ड को एक स्ट्रिंग वेरिएबल में डालने और फिर int.Parse (ओं) को आजमाने की कोशिश की। कोड इस सप्ताह के शुरू में काम करता था और डेटाबेस नहीं बदला है। एकमात्र चीज जो बदल गई है वह मेरा पर्यावरण है।

पूरी तरह से समस्या को आसान बनाने के लिए, कोड की इस पंक्ति एक अपवाद ("इनपुट स्ट्रिंग सही स्वरूप में नहीं था") फेंकता है:

int.Parse("0"); 

संपादित करें: मुझे इस समस्या को हल मदद करने के लिए हर किसी के लिए धन्यवाद! समाधान मेरी भाषा सेटिंग्स के रीसेट को मजबूर कर रहा था।

+0

तालिका कॉलम क्या डेटाटाइप है? –

+0

क्या फ़ील्ड शून्य मान की अनुमति देता है? –

+0

यदि आप कस्टम निष्पादन कोड की एकमात्र पंक्ति int.Parse ("0") के साथ एक नया अनुप्रयोग बनाते हैं; और यह एक त्रुटि फेंक रहा है, तो मुझे लगता है कि आपको एक बड़ी समस्या हो सकती है। –

उत्तर

21

एक संभावित explanation:

मूल रूप से, समस्या HKEY_CURRENT_USER \ नियंत्रण पैनल \ अंतर्राष्ट्रीय 0 पर सेट किया जा रहा, जो सकारात्मक संकेत का मतलब है '0' के तहत sPositiveSign मूल्य था। इस प्रकार, "सकारात्मक साइन 0" को पार्स करते समय काट दिया जा रहा है और फिर स्ट्रिंग ("") के बाकी को नंबर के रूप में पार्स किया गया है, जो निश्चित रूप से काम नहीं करता है। यह भी बताता है कि int.Parse ("00") कोई समस्या नहीं थी। यद्यपि आप नियंत्रण कक्ष के माध्यम से '0' पर सकारात्मक संकेत सेट नहीं कर सकते हैं, फिर भी यह रजिस्ट्री के माध्यम से ऐसा करने के लिए संभव है, जिससे समस्याएं उत्पन्न हो रही हैं। पता नहीं कैसे पद यह गलत सेटिंग के साथ समाप्त हो गया में उपयोगकर्ता के कंप्यूटर ...

अभी तक बेहतर, क्या आपकी मशीन पर इस बात का उत्पादन होता है:

Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign); 

मैं मैं 0 बाहर प्रिंट करने के लिए तैयार हूं ... जब मेरा + साइन प्रिंट करता है।

मैं आपके Control Panel > Regional and Language Options सेटिंग्स की जांच करने का सुझाव देता हूं ... यदि वे सामान्य दिखाई देते हैं, तो आप जिस भी भाषा का उपयोग कर रहे हैं उससे पहले किसी अन्य चीज़ को बदलने का प्रयास करें (मैं अंग्रेजी मान रहा हूं)।

+0

क्या वह इसके बजाय एक ऑक्टल 0 नहीं देगा? –

+0

धन्यवाद, मैं कुत्तों को बाहर जाने के बाद थोड़ा सा जांच करूंगा, एलओएल। – Leslie

+0

@chris - नहीं (इसे "010" के साथ आज़माएं, आपको अभी भी 10 मिलते हैं), लेकिन यहां तक ​​कि एक ऑक्टल 0 अभी भी 0 है 0 :) –

2

क्या आप वाकई "0" हैं और "शून्य" नहीं हैं? आपको क्या अपवाद मिलता है?

संपादित करें:

बस जिज्ञासा से बाहर

, अगर यह वास्तव में int.Parse ("0") पर दोषयुक्त है, तो आप int.Parse ("0", CultureInfo.InvariantCulture) कोशिश कर सकते हैं ;?

अन्यथा, अपनी क्वेरी पोस्ट करें। कोई भी शामिल है?

+0

मैं सकारात्मक हूं यह शून्य है और शून्य नहीं है। कॉलम में केवल 0, 1, और 2. केवल 0 विफल रहता है। सिस्टम। फ़ॉर्मेट अपवाद: इनपुट स्ट्रिंग सही प्रारूप में नहीं थी। – Leslie

+0

0 संख्यात्मक मूल्य के रूप में संग्रहीत किया गया है? तालिका में कॉलम किस डेटा प्रकार है। –

+0

डेटाबेस फ़ील्ड int है। – Leslie

2

संपादित करें: int.Parse weird behavior

रिक्त स्ट्रिंग भी इस मुद्दे का कारण होगा:
@ माइक की प्रतिक्रिया मुझे लगता है कि अत्यंत अजीब व्यवहार और एक सरल गूगल खोज इस परिणाम सामने आए है बनाया है।

आप पार्सिंग से पहले डीबीएनएल की जांच कर सकते हैं, यह पार्स किए गए डेटा को सत्यापित करना भी अच्छा है।

.. आप एक डिफ़ॉल्ट मान और TryParse इस्तेमाल कर सकते हैं

int i = -1; 
if(!int.TryParse(dr["MyColumn"] as string, out i)) 
    //Uh Oh! 

संपादित करें:
मैं @Chris 'जवाब में एक टिप्पणी के रूप में इस पोस्ट, लेकिन अगर एसक्यूएल डेटाप्रकार पूर्णांक है तो क्यों सिर्फ का उपयोग नहीं GetInt32 डेटारिएटर पर एक स्ट्रिंग और मैन्युअल रूप से इसे पार्स करने के बजाय इसे पुनर्प्राप्त करने के बजाय विधि?

+0

मुझे लगता है कि उसके साथ भी समस्याएं थीं, लेकिन मुझे याद नहीं है कि वे अब क्या थे। मैं पूरे दिन कुश्ती कर रहा हूं। – Leslie

+0

उस संपादन को जोड़ने के लिए धन्यवाद! यह वही है जो मैं खोज रहा था। मुझे नहीं पता कि उसे खोजने के लिए उन्हें कितना समय लगेगा :) मैं आपको देखने के लिए सही लिंक खोजने की सराहना करता हूं। – Mike

+0

@ माइक, कोई समस्या नहीं जब आपने कहा कि आपको एक ही समस्या है, मुझे इसे देखना था, मुझे सच में खुशी है कि यह सहायक था। –

3

मुझे लगता है कि इसे आम तौर पर कनवर्ट करने का अच्छा विचार नहीं माना जाता है।डेटाबेस से बाहर पढ़ने के मान के लिए ToInt32, मान के बारे में क्या शून्य है, मूल्य के बारे में क्या पार्स नहीं किया जा सकता है। क्या आपके पास यहां कोई अपवाद हैंडलिंग कोड है।

  1. सुनिश्चित करें कि मान शून्य नहीं है।
  2. कॉल Int32.Parse कॉल करने से पहले मूल्य को पार्स किया जा सकता है। Int32.TryParse पर विचार करें।
  3. int जैसे एक शून्य प्रकार का उपयोग करने पर विचार करें? इस मामले में।

एचटीएच।

0

क्या आप शून्य की जांच कर रहे हैं?

if(!dr.IsNull("FieldName")){ 
    int i = Convert.ToInt32(dr["FieldName"])) 
} 
1

आप डॉ [ "FIELDNAME"] की जाँच करनी चाहिए! = DBNull.Value और अगर यह DBNull परीक्षण में सफ़ल आप TryParse का उपयोग करना चाहिए ...

if (dr["FieldName"] != DBNull.Value) 
{ 
    int val = 0; 
    if (int.TryParse(dr["FieldName"], out val)) 
    { 
     i = val; 
    } 
    else 
    { 
     i = 0; // or some default value 
    } 
} 
1

मैं के साथ इस मुद्दे फसल ऊपर देखा है स्ट्रिंग "0" से भी पार्सिंग .NET डबल क्लास।

यहां वास्तव में निराला हिस्सा है: प्रोग्राम चलाने के लिए अलग-अलग उपयोगकर्ता खाते का उपयोग करके आप समस्या को हल कर सकते हैं, और कभी-कभी यदि आप मशीन पर वर्तमान उपयोगकर्ता खाते को नष्ट और पुन: बनाते हैं, तो यह ठीक हो जाएगा ।

मैंने अभी तक इसे ट्रैक नहीं किया है, लेकिन आप इसे कम से कम इस तरह से प्राप्त कर सकते हैं।

+0

कोशिश करने के लिए त्रुटि-हैंडलिंग के अलावा कुछ के लिए धन्यवाद !!! मुझे पता है कि कैसे नल की जांच करें। :) – Leslie

1

यह बाएं क्षेत्र से बाहर है, लेकिन अपनी स्थानीयकरण सेटिंग जांचें। जब मैंने एक कनाडाई सर्वर पर एक वेब साइट ले जाया तो मेरे पास "इनपुट स्ट्रिंग सही प्रारूप में नहीं थी"। समस्या डेटटाइम में थी। पर्स विधि, और संस्कृति को "एन-यूएस" में सेट करके तय किया गया था।

हां, आपकी स्थिति अलग है — लेकिन हे, आप कभी नहीं जानते।

+0

हां, यह स्थानीयकरण था। यह कहा गया कि यह यूएस-एन पर था, लेकिन इसे फ्रेंच में बदलकर अंग्रेजी में वापस समस्या हल हो गई। धन्यवाद! – Leslie

संबंधित मुद्दे