2009-07-31 10 views
18

कोई भी डीबी को डेटा (वास्तव में एक कक्षा) क्रमबद्ध करने का सबसे अच्छा तरीका सुझा सकता है?सी # क्लास सीरियल सीक्यूएल सर्वर पर सीधे?

मैं SQL सर्वर 2008 का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि डेटाबेस में संग्रहीत करने से पहले मुझे कक्षा को स्ट्रिंग/या अन्य डेटा प्रकार में क्रमबद्ध करने की आवश्यकता है?

मुझे लगता है कि इस क्षेत्र को टेक्स्ट या बाइनरी होना चाहिए ??

क्या SQL सर्वर 2008 (या .NET 3.5) डेटाबेस को सीधे क्रमबद्ध करने का समर्थन करता है ??

किसी भी मदद वास्तव में

उत्तर

36

सराहना आप एक xml क्षेत्र में वर्ग को क्रमानुसार एक्सएमएल कर सकते हैं। हम ईटीएल में अपवाद लॉगिंग के लिए हर समय इसका इस्तेमाल करते हैं।

XmlSerializer आप का उपयोग कहीं एक सहायक विधि है जो एक स्ट्रिंग के लिए वर्ग को धारावाहिक चाहते हो सकता है ...

public static string SerializeToXml<T>(T value) 
{ 
    StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    serializer.Serialize(writer, value); 
    return writer.ToString(); 
} 

तो बस किसी भी अन्य की तरह डाटाबेस में स्ट्रिंग डाल दिया।

+0

क्यों मैं इस के लिए एक सामान्य उपयोग के बारे में नहीं सोचा था? * चेहरा हथेली * –

+2

@tom - क्योंकि यहां सामान्य के लिए कोई आवश्यकता नहीं है। आप "ऑब्जेक्ट वैल्यू" का समान रूप से अच्छी तरह से उपयोग कर सकते हैं और फिर serializer का निर्माण करते समय "value.GetType()" को कॉल कर सकते हैं। –

+0

धन्यवाद मैंने अंत में यह किया, –

19

डेटाबेस में डेटा स्टोर करने के लिए सर्वोत्तम तरीका कॉलम (प्रति संपत्ति) में है, ताकि यह क्वेरी करने योग्य और अनुक्रमणीय हो। ओआरएम उपकरण इससे मदद करेंगे।

हालांकि, यह भी एक CLOB/ब्लॉब (varchar(max)/varbinary(max) आदि) के रूप में एक वर्ग को क्रमानुसार करने के लिए संभव है।

यह वही है जो आप चाहते हैं, कार्यान्वयन-विशिष्ट या संस्करण-असहिष्णुता से बचें; तो विशेष रूप से, BinaryFormatter का उपयोग न करें। अनुबंध अनुबंध आधारित कुछ भी काम करना चाहिए; XmlSerializer, DataContractSerializer, आदि। या तेजी से बाइनरी के लिए, प्रोटोबफ-नेट एक लायक हो सकता है।

लेकिन मुझे तनाव है; कॉलम बेहतर होगा।

+0

मार्क - क्यों आप टाइनो को बाइनरीफॉर्मेटर से बचने की सलाह देते हैं? यह आकार में कम है ... साथ ही, अनुबंध आधार डीबी में सहेजे जा रहे डेटा को कैसे सुधारता है? –

+0

@RoyiNamir इसे पूर्ण प्रकार के नाम (असेंबली समेत) आदि के कारण, और क्षेत्र-निर्भर होने के कारण संस्करणिंग के साथ गंभीर समस्याएं हो सकती हैं। यह एक लंबे शॉट से सबसे छोटा नहीं है। मैं आमतौर पर प्रोटोबफ-नेट की सलाह देता हूं जो आम तौर पर कम जगह होती है * और * सभी छंदों की समस्याओं से बचाती है - लेकिन मैं कुछ हद तक पक्षपातपूर्ण हूं। –

+0

मैं देखता हूं, लेकिन अभी भी 'पूर्ण प्रकार के नामों को शामिल करने के कारण' नहीं समझता .. इसके साथ क्या गलत है? अगर मैं टाइपिंग कर रहा हूं तो क्या गलत है (उदाहरण: 'सूची () ') ... क्या आप कृपया किसी शब्द या 2 में व्याख्या कर सकते हैं? धन्यवाद। –

1

मैंने ऑब्जेक्ट को एक्सएमएल के रूप में क्रमबद्ध किया है और डेटाबेस को ठीक से फेंक दिया है। चूंकि हम पाठ की अधिकतम मात्रा को जानते थे, हमने टेक्स्ट या बाइनरी प्रारूपों में जाने के बजाय वर्चर (अधिकतम) डेटाटाइप का उपयोग किया था।

यह एक ओएलटीपी वेब एप्लिकेशन था और एक चीज जो हमने पाया वह था कि एक एक्सएमएल डेटाटाइप के साथ एक कॉलम का उपयोग करके कुछ महत्वपूर्ण सीपीयू उपयोग का आह्वान किया गया क्योंकि एक्सएमएल प्रत्येक सम्मिलन पर मान्य था। हमारे मामले में एक्सएमएल को किसी भी चीज के लिए कभी पूछताछ नहीं की गई थी, इसलिए एक्सएमएल क्वेरी क्षमताओं ने हमारे लिए ठीक काम नहीं किया।

0

विकल्पों में से जोड़ी हैं:

रनटाइम क्रमबद्धता, serializable वस्तुओं Serializable विशेषता, जिस स्थिति में IFormatter वर्ग क्रमबद्धता के सभी काम करता है के साथ चिह्नित हैं। एक serializable ऑब्जेक्ट ISerializable कर सकते हैं, लेकिन फिर आप GetObjectData() विधि को लागू करने की आवश्यकता होगी। रनटाइम क्रमबद्धता के साथ समस्या यह है कि एक्सएमएल डेटा पढ़ने वाले प्रोग्राम को सीएलआर प्रकारों के ज्ञान की आवश्यकता है।

एक्सएमएल क्रमबद्धता: अनलाइन रनटाइम सीरियलाइजेशन, आपको इस मामले में अच्छी इंटरऑपरेबिलिटी मिल जाएगी। XmlSerializer प्रकार में Serialize() और Deserialize(), विधियों को शामिल किया गया है, किसी भी ऑब्जेक्ट को XML में क्रमबद्ध किया जा सकता है और डेटाबेस में सहेजा जा सकता है और जब आप इसे वापस पुनर्प्राप्त करते हैं, तो आप इसे आसानी से deserialize कर सकते हैं।

डेटाबेस से डेटा पढ़ने के लिए, आप एसक्यूएल कॉमांड क्लास विधि का उपयोग कर सकते हैं जो SQL क्वेरी निष्पादित करता है, अर्थात् ExecuteXmlReader()। ExecuteXmlReader() XmlReader का एक उदाहरण देता है और यह आपके XML डेटा को पढ़ेगा।

3

जेनरिक के बिना (बेहतर sollution)

public static string SerializeToXml(object value) 
{ 
    StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); 
    XmlSerializer serializer = new XmlSerializer(value.GetType()); 
    serializer.Serialize(writer, value); 
    return writer.ToString(); 
} 
संबंधित मुद्दे