2008-08-15 16 views
13

हमारे पास हमारा स्वयं का ओआरएम है जिसका हम यहां उपयोग करते हैं, और हमारे सभी डीबी टेबल के लिए दृढ़ता से टाइप किए गए रैपर प्रदान करते हैं। हम कमजोर टाइप किए गए विज्ञापन-प्रसार एसक्यूएल को निष्पादित करने की अनुमति भी देते हैं, लेकिन डेटा प्रश्नकर्ता से मूल्य प्राप्त करने के लिए ये प्रश्न अभी भी एक ही कक्षा के माध्यम से जाते हैं।सी # डाटाबेस एक्सेस: डीबीएनएल बनाम शून्य

उस वर्ग Oracle के साथ काम करने के लिए सुधार करने के लिए, हम एक दिलचस्प सवाल का सामना करना पड़ा। क्या डीबीएनयूएल का उपयोग करना बेहतर है। वैल्यू, या शून्य? क्या डीबीएनयूएल का उपयोग करने के कोई लाभ हैं। वैल्यू? यह शून्य का उपयोग करने के लिए और अधिक "सही" लगता है, क्योंकि हमने खुद को डीबी दुनिया से अलग कर दिया है, लेकिन प्रभाव हैं (उदाहरण के लिए कोई मान शून्य होने पर आप अंधेरे से ToString() नहीं कर सकते हैं) तो निश्चित रूप से हमें कुछ बनाने की आवश्यकता है के बारे में सचेत निर्णय।

उत्तर

15

मुझे डीबी नल के बजाय, शून्य का उपयोग करना बेहतर लगता है।

कारण यह है कि, जैसा कि आपने कहा था, आप खुद को डीबी दुनिया से अलग कर रहे हैं।

यह सुनिश्चित करने के लिए संदर्भ प्रकारों की जांच करना आम तौर पर अच्छा अभ्यास है कि वे वैसे भी शून्य नहीं हैं। आप डीबी डेटा के अलावा अन्य चीज़ों के लिए शून्य की जांच करने जा रहे हैं, और मुझे लगता है कि सिस्टम में स्थिरता बनाए रखना सबसे अच्छा है, और DBNull नहीं, शून्य का उपयोग करें।

लंबे समय तक, वास्तुकला में मुझे यह बेहतर समाधान लगता है।

3

अनुभव मैं मिला है से, नेट DataTables और TableAdapters DBNull के साथ बेहतर काम। यह दृढ़ता से टाइप किए जाने पर कुछ विशेष तरीकों को भी खुलता है, जैसे डेटारो.इस फर्स्टनाम नाम जब जगह में होता है।

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

1

DBNull का उपयोग करें।
हमने शून्य का उपयोग करते समय कुछ प्रकार की समस्याओं को घुमाया।
यदि मुझे सही ढंग से याद किया जाता है तो आप केवल एक क्षेत्र में शून्य मूल्य नहीं डाल सकते हैं, केवल डीबीएनयूएल।
केवल ओरेकल से संबंधित हो सकता है, क्षमा करें, मुझे अब विवरण नहीं पता है।

7

आप अपने खुद के ORM लिखा है, तो मैं कहूंगा कि सिर्फ अशक्त उपयोग करते हैं, क्योंकि आप इसे उपयोग कर सकते हैं लेकिन आप चाहते हैं। मेरा मानना ​​है कि डीबीएनयूएल का मूल रूप से केवल इस तथ्य के आसपास उपयोग करने के लिए उपयोग किया जाता था कि मूल्य प्रकार (int, DateTime, आदि) शून्य नहीं हो सकता है, इसलिए शून्य या डेटटाइम जैसे कुछ मान वापस करने के बजाय। Min, जो एक शून्य (बुरा, बुरा), उन्होंने यह इंगित करने के लिए डीबीएनयूएल बनाया। शायद इसके लिए और भी कुछ था, लेकिन मुझे हमेशा लगता था कि यही कारण था। हालांकि, अब हमारे पास सी # 3.0 में शून्य प्रकार हैं, डीबीएनएल अब आवश्यक नहीं है। वास्तव में, LINQ से SQL बस पूरे स्थान पर शून्य का उपयोग करता है। बिल्कुल भी परेशानी नहीं है। भविष्य को गले लगाओ ... शून्य का उपयोग करें। ;-)

+0

मुझे लगता है कि अभी भी डीबीएनयूएल के लिए कुछ उपयोग हैं। कम से कम sqlite के साथ मैं परीक्षण कर सकता हूं कि ExecuteScalar() द्वारा लौटाए गए मान को डेटाबेस में स्पष्ट रूप से संग्रहीत किया गया है या नहीं। टेबल फू (एक int, बी int) पर विचार करें; एक पंक्ति के साथ (1, शून्य)। अगर हम एक आदेश पर ExecuteScalar पर थे "foo से F चुनें जहां ए = 1", यह DBNull वापस करेगा। Value (पंक्ति मौजूद है एक शून्य संग्रहीत है)। अगर मैं ExecuteScalar को "F से F चुनें जहां ए = 2" पर कॉल करना था, तो यह शून्य वापस आ जाएगा (ऐसी कोई पंक्ति मौजूद नहीं है)। संभवतः आप डेटा रीडर के साथ एक ही परिणाम प्राप्त कर सकते हैं लेकिन मैं सुविधा की सराहना करता हूं। – fostandy

+0

दिलचस्प। डीबी एक्सेस के लिए ओआरएम का उपयोग करते समय, मैं अक्सर अपने कोड में ExecuteScalar का स्पष्ट रूप से उपयोग नहीं करता हूं। मैं आमतौर पर पूर्ण इकाई वस्तुओं को पुनर्प्राप्त करना और उनके मूल्यों को इस तरह देख रहा हूं। तो अगर इकाई स्वयं शून्य है तो यह एक बात है, और यदि मूल्य शून्य है, तो यह कुछ और है। इसे करने के बस अलग तरीके।मैं स्वीकार करता हूं कि यदि आपको केवल एक ही मूल्य की आवश्यकता है तो ExecuteScalar अधिक कुशल है। – jeremcc

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