2012-07-04 16 views
8

से दशमलव मान पढ़ने पर ओवरफ़्लो अपवाद मुझे आश्चर्य है कि यह एक बग है या यदि मैं कुछ गलत कर रहा हूं।SQL सर्वर

मैं SQL Server 2008 डेटाबेस से SqlDataReader के साथ मान लोड कर रहा हूं लेकिन कुछ परिस्थितियों में, यह SQL मानों को .net मानों में परिवर्तित करने में विफल रहता है। (.NET 4,0)

मैं इसे एक परीक्षण मामले में जो वास्तविक समस्या को दर्शाता है करने के लिए नीचे का पता लगाया है:

कार्य उदाहरण:

"select convert(decimal(38, 19), 260000) as test" 
rs.GetValue(1); 
--> returns 260000 (decimal) 

काम नहीं कर उदाहरण के:

"select convert(decimal(36, 26), 260000) as test" 

rs.GetValue(1); 
--> throws 
    System.OverflowException: Conversion overflows. 
    at System.Data.SqlClient.SqlBuffer.get_Decimal() 
    at System.Data.SqlClient.SqlBuffer.get_Value() 
    at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) 

मैंने वास्तविक मानों की जांच की है जो SQL सर्वर को सुरक्षित किया गया है। वे अलग है कि गैर काम काम कर रहे एक के बाद एक 4 पूर्णांकों का उपयोग करता है मूल्य व्यक्त करने के लिए, केवल 3.

मैं भी जो अनावरण किया कि एक अपवाद है, तो मूल्य अधिक की मौजूद फेंक दिया जाता है .net परावर्तक साथ स्रोत कोड की जांच की थी फिर 3 मान, लेकिन मैं उनके पीछे यांत्रिकी को समझ नहीं पा रहा हूं।

तो, मुझे आश्चर्य है कि यह .NET ढांचे में एक वास्तविक बग है या नहीं।

+0

दशमलव मानों के लिए प्रेसिजन केवल 28 तक है। कृपया लिंक के माध्यम से जाएं http://stackoverflow.com/questions/745270/c-sharp-sizeof-decimal – praveen

+0

लेकिन कामकाजी उदाहरण भी उच्च परिशुद्धता का उपयोग करता है। – Chuck

उत्तर

6

यह कुछ भी नहीं है जो आप गलत कर रहे हैं, शायद अधिक सटीक होने के अलावा। मुझे नहीं लगता कि यह new problem either है।

आप इसकी एक बग, या कार्यक्षमता में केवल एक अंतर का तर्क दे सकते हैं। .NET Decimal संरचना केवल आपके SQL सर्वर decimal में संग्रहीत मान का प्रतिनिधित्व नहीं कर सकती है, इसलिए OverflowException फेंक दिया गया है।

या तो आपको इसे पुनर्प्राप्त करने से पहले डेटाबेस में संगत कुछ करने के लिए मूल्य में हेरफेर करने की आवश्यकता है या कच्चे बाइनरी या स्ट्रिंग प्रारूप में डेटा को पढ़ें और नेट पक्ष पर हेरफेर करें।

वैकल्पिक रूप से, आप इसे एक नया प्रकार लिख सकते हैं जो इसे संभालता है।

पहली जगह में संगत decimal परिभाषा का उपयोग करने के लिए शायद यह आसान है, जब तक कि आपको वास्तव में उस परिशुद्धता की आवश्यकता न हो। यदि आप करते हैं तो मुझे यह जानने में दिलचस्पी होगी कि क्यों।

+0

सटीक पैरामीटर SQL सर्वर द्वारा स्वयं चुने गए थे। मैं मूल रूप से सर्वर पर (10,2) और (10,4) फ़ील्ड के बीच कुछ बुनियादी गणना कर रहा था। सर्वर ने वापसी प्रकार के रूप में (36,26) उठाया। मैंने अब सभी क्षेत्रों को बदल दिया (18,4), और अब तक यह काम कर रहा है। – Chuck

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

  • कोई संबंधित समस्या नहीं^_^