2011-12-08 16 views
9

DataReader [i] बनाम DataReader.GetValue (i) बनाम DataReader.GetString (i)

dataReader[i] 

तार्किक

dataReader.GetValue(i) 

के बराबर वे एक ही कर रहे हैं है? क्या वे अलग हैं? क्या ऐसी कोई स्थिति है जहां कोई दूसरे पर उपयुक्त होगा?

वहाँ documented differently हैं:

  • निर्दिष्ट सूचकांक
  • वापसी निर्दिष्ट फ़ील्ड का मान पर स्थित स्तंभ हो जाता है।

लेकिन जब मैं उन्हें इस्तेमाल वे दोनों फ़ील्ड का मान लौट आते हैं। "कॉलम प्राप्त करने" का क्या अर्थ है? "किसी क्षेत्र के मूल्य को वापस करने" का क्या अर्थ है?


बोनस चैटर:

जब मैं फोन:

reader[i]; 
reader.GetValue(i); 
reader.GetString(i); 

मैं एक String हर बार

उत्तर

15

अंततः यह System.Data.IDataReader की विशेष कार्यान्वयन आप बात कर रहे हैं पर निर्भर करता है मिल , लेकिन मान लें कि आपका मतलब System.Data.SqlClient.SqlDataReader है।

इस मामले में, reader[i] और reader.GetValue(i)ठीक एक ही चीज़ है। वास्तव में, reader[i] आंतरिक रूप से reader.GetValue(i) पर कॉल करता है। (आप इसे ILSpy जैसे टूल का उपयोग करके कोड को अलग करके देख सकते हैं।)। ये दोनों सदस्य वर्तमान पंक्ति के i-th कॉलम में मान वापस कर देते हैं और मूल्य के प्रकार के बावजूद सफलतापूर्वक वापस आ जाएंगे (वापसी का प्रकार object है)। इन दोनों सदस्यों के लिए प्रलेखन थोड़ा भ्रामक है और इसे बेहतर तरीके से कहा जा सकता है। आप जहां भी चाहें इन सदस्यों में से किसी एक का उपयोग कर सकते हैं, बस वह चुनें जिसे आप बेहतर पढ़ते हैं।

जबकि reader.GetString(i) विशेष रूप से string के रूप में वर्तमान पंक्ति के i-th कॉलम में निहित मान को वापस करने के लिए डिज़ाइन किया गया है। यदि उस कॉलम में मान string नहीं है, तो InvalidCastException फेंक दिया जाएगा। इस विधि का उपयोग करें जब आप सुनिश्चित हों कि मान string और string वह प्रकार है जिसे आप काम करना चाहते हैं। इससे आपका कोड अधिक संक्षिप्त हो जाएगा क्योंकि आपको कलाकार नहीं करना होगा।

आपके विशिष्ट मामले में, वर्तमान पंक्ति के i-th कॉलम में मान string प्रकार होना चाहिए, यही कारण है कि सभी तीन सदस्यों का वापसी मूल्य समान है।

यदि सही ढंग से लिखा गया है, तो System.Data.IDataReader के अन्य कार्यान्वयन समान तरीके से व्यवहार करना चाहिए।

+0

भयानक किनारे के मामले हैं, जहां 'GetValue' एक' बाइट 'देता है, लेकिन 'GetInt32' एक इंट 32 –

+0

पर बाइट डालने में असमर्थ है, यह कहना मुश्किल है (विशेष रूप से क्योंकि असंबद्ध कोड का पालन करना मुश्किल है) लेकिन यह प्रतीत होता है कि कॉलम में मान पहले से वांछित प्रकार का होना चाहिए अन्यथा अमान्यकास्टएक्सप्शन (जो स्वयं ही थोड़ा भ्रामक है) फेंक दिया जाएगा। मैं जवाब संपादित कर दूंगा। –

+0

वास्तव में, GetInt32 (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx) के लिए प्रलेखन बताता है कि "कोई रूपांतरण नहीं किया जाता है, इसलिए, डेटा पुनर्प्राप्त किया जाना चाहिए पहले से ही 32-बिट हस्ताक्षरित पूर्णांक हो। " अन्य GetXXX विधियों को समान रूप से दस्तावेज किया गया है। –

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