2010-06-30 9 views
30

मैं एसक्यूएल सर्वर के साथ कुछ सी # कोड इंटरफेस करने कर रहा हूँ और मैं जब डेटाबेस में एक मूल्य के भंडारण के रूप में मैं अपने सी # कोड के साथ क्या वास्तव में के रूप में ज्यादा सटीक करना चाहते हैं। मैं एक मान के लिए .NET के decimal प्रकार का उपयोग करता हूं। SQL सर्वर में इस मान के लिए मैं किस डेटाटाइप/परिशुद्धता का उपयोग करूंगा?SQL सर्वर दशमलव के लिए .NET दशमलव का अच्छा मैपिंग क्या है?

मुझे पता है कि SQL सर्वर decimal प्रकार वह प्रकार है जो संभवतः इसके लिए मेरी आवश्यकताओं को फिट करता है। मेरा सवाल यह है कि मैं किस पैमाने और परिशुद्धता का उपयोग करता हूं ताकि यह .NET के decimal प्रकार से मेल खा सके?

+0

+1 अच्छा सवाल! मैं 8 महीने पहले एसओ पर एक ही सवाल पूछने जा रहा था, लेकिन मैं पूरी तरह से भूल गया! – spong

उत्तर

10

आप SQL सर्वर decimal प्रकार (documentation here) का उपयोग कर सकते हैं। यह आपको डेटाबेस में संख्याओं के लिए एक सटीकता और स्केल निर्दिष्ट करने की अनुमति देता है, जिसे आप अपने सी # कोड के समान सेट कर सकते हैं।

हालांकि, आपका प्रश्न .NET दशमलव प्रकार को SQL सर्वर दशमलव प्रकार पर मैप करने के बारे में प्रतीत होता है। और दुर्भाग्य से, यह सीधा नहीं है। एसक्यूएल सर्वर दशमलव, अधिकतम शुद्धता पर, 10 -1 -10 +1 से रेंज को कवर। .NET में, हालांकि, यह संख्या के आधार पर ± 10 -28 से ± 7.9 × 10 से कहीं भी कवर कर सकता है।

कारण यह है कि, आंतरिक रूप से, .NET दशमलवों के समान दशमलव के समान होता है-यह इसे संख्याओं, एक मंटिसा और एक एक्सपोनेंट के रूप में संग्रहीत करता है। यदि आपके पास विशेष रूप से बड़ी मंटिसा है, तो आप कुछ परिशुद्धता खोने जा रहे हैं। अनिवार्य रूप से, .NET आपको उन संख्याओं को मिश्रण करने की अनुमति देता है जिनमें उच्च और निम्न दोनों स्तर होते हैं; एसक्यूएल सर्वर के लिए आपको समय से पहले दिए गए कॉलम के लिए इसे चुनना होगा।

कम में, आप यह तय करें कि दशमलव मूल्यों की मान्य श्रेणी है, अपने उद्देश्यों के लिए है, और दोनों अपने कार्यक्रम और डेटाबेस इसे संभाल कर सकते हैं सुनिश्चित करने की आवश्यकता के लिए जा रहे हैं। आपको अपने कार्यक्रम के लिए वैसे भी ऐसा करने की ज़रूरत है (यदि आप 10 -28 जैसे मानों को 7.9 × 10 के साथ मिश्रित कर रहे हैं, तो आप किसी भी प्रकार के दशमलव प्रकार पर भरोसा नहीं कर सकते हैं)।

+3

मैं जो पूछ रहा हूं वह SQL सर्वर के लिए है, मुझे 'सटीक' और 'स्केल' के लिए उपयोग किए जाने वाले मान क्या होंगे ताकि यह .NET 'दशमलव' के बराबर सटीक हो? (ध्यान दें कि 1.25 और 1.250 अंक हमारे लिए प्रासंगिक नहीं हैं) – Earlz

4

This chart may help you.

numerics और SQL सर्वर में दशमलव के लिए अधिकतम परिशुद्धता 38 (see here) है।

+0

हां, एसक्यूएल दशमलव के लिए .NET दशमलव ठीक होना चाहिए – Riaan

+0

हालांकि SQL सर्वर के लिए 'दशमलव' की सटीकता क्या है? ऐसा लगता है कि डिफ़ॉल्ट '(18,0)' है जो निश्चित रूप से मैं नहीं चाहता था। – Earlz

1

या आप भी MONEY डेटा प्रकार पर विचार करना चाहते हो सकता है:

+0

लाभ लिंक चला गया है, लेकिन यहां पढ़ा जा सकता है: http://web.archive.org/web/20101223234827/http://sqlcat.com/technicalnotes/archive /2008/09/25/the-many-benefits-of-money-data-type.aspx –

20

धाराप्रवाह NHibernate नक्शे System.Decimal

decimal(19, 5) 
+1

वैसे, पैसा दशमलव है (1 9 4) –

0

संक्षिप्त उत्तर के रूप में वह सी # डीसीमा है एल एक 128 बिट फ्लोटिंग पॉइंट सटीक संख्या है और इसमें एसक्यूएल सर्वर में सटीक समतुल्य नहीं है।

भविष्य में एसक्यूएल सर्वर संस्करण में हो सकता है, माइक्रोसॉफ्ट अपने दोनों उत्पादों से मेल खाता है और 128 बिट फ्लोटिंग पॉइंट परिशुद्धता संख्या के सीधे आगे [clr/C# दशमलव समतुल्य] का समर्थन करेगा, सीधे अपने डेटाबेस सर्वर पर बने रहने के लिए।

बहुत बड़ी और बहुत छोटी मात्रा से निपटने के दौरान मुझे यह विश्लेषण समस्या थी।मेरे मामले में, मेरे समाधान के भीतर सभी तुलनात्मक मात्रा 64 बिट रेंज के अंदर है [सी # डबल/एसक्यूएल फ्लोट] संभाल सकता है। इसलिए, मैंने अपने समाधान के वित्तीय भाग से निपटने के दौरान मात्राओं से निपटने के दौरान [सी # डबल/एसक्यूएल फ्लोट] का उपयोग करना चुना है, और [सी # दशमलव/एसक्यूएल पैसा]।

0

सी # decimal प्रकार का आकार 128 बिट्स (16 बाइट्स) है। SQL सर्वर में यदि आप 20-28 के बीच सटीकता निर्दिष्ट करते हैं तो यह भंडारण के लिए 13 बाइट्स का उपयोग करेगा। यदि आप 29-38 के बीच सटीकता निर्दिष्ट करते हैं, तो यह भंडारण के लिए 17 बाइट्स का उपयोग करेगा। आपके डेटाबेस के लिए .NET के दशमलव प्रकार के लिए मानों की पूरी संभावित सीमा को संग्रहीत करने में सक्षम होने के लिए, आपको SQL सर्वर के decimal प्रकार का न्यूनतम परिशुद्धता के साथ उपयोग करना होगा। क्योंकि 2 9 और 38 के बीच कोई भी सटीकता उसी राशि का उपयोग करेगी भंडारण के लिए बाइट्स (17), यह 38 के चयन के लिए आपकी रुचि में है।

सी # का दशमलव प्रकार आपको पूर्व विनिर्देश के बिना इसका उपयोग करने की अनुमति देता है, वास्तव में आप किस परिशुद्धता का उपयोग करेंगे और दशमलव विभाजक के बाद कौन सा हिस्सा उपयोग करेंगे। आपके पास SQL ​​सर्वर में वह लक्जरी नहीं है। पैमाने के लिए निर्णय पूरी तरह से आपकी आवश्यकताओं पर निर्भर करता है, लेकिन आपको यह निर्णय लेना होगा क्योंकि यदि आप स्केल निर्दिष्ट नहीं करते हैं तो यह डिफ़ॉल्ट रूप से 0 होगा और आप फ्लोटिंग पॉइंट नंबरों को बिल्कुल भी स्टोर नहीं कर पाएंगे।

उपर्युक्त सत्य है यदि आपको यह सुनिश्चित करना है कि आप संपूर्ण .NET दशमलव सीमा को स्टोर करने में सक्षम होंगे।

यदि आप अपने ऐप में पैसे के लिए सी # के दशमलव का उपयोग करते हैं, तो मुझे लगता है कि दशमलव (1 9, 4) पर्याप्त होगा।

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