2009-05-26 8 views
26

क्या एसक्यूएलटाइडर की वर्तमान पंक्ति के सभी कॉलम को एक शब्दकोश में कनवर्ट करने का कोई आसान तरीका है?SqlDataReader - वर्तमान पंक्ति को एक शब्दकोश में कनवर्ट करने के लिए कैसे करें

using (SqlDataReader opReader = command.ExecuteReader()) 
{ 
// Convert the current row to a dictionary 
} 

धन्यवाद

उत्तर

51

आप LINQ का उपयोग कर सकते हैं:

return Enumerable.Range(0, reader.FieldCount) 
       .ToDictionary(reader.GetName, reader.GetValue); 
+0

आपकी प्रतिक्रिया दिलचस्प लगती है, लेकिन मुझे इसे VB.NET में चाहिए, और मुझे नहीं पता कि अंतिम भाग का अनुवाद कैसे करें - .ToDictionary (reader.GetName, reader.GetValue)। कोई शक्कर? धन्यवाद – bzamfir

+1

@bzamfir: आपको 'पताOf' की आवश्यकता है। – SLaks

+5

मैं linq-is-everything bandwagon पर कूदने से सावधान हूं लेकिन यह शानदार है। –

24

इस से आसान ?:

// Need to read the row in, usually in a while (opReader.Read) {} loop... 
opReader.Read(); 

// Convert current row into a dictionary 
Dictionary<string, object> dict = new Dictionary<string, object>(); 
for(int lp = 0 ; lp < opReader.FieldCount ; lp++) { 
    dict.Add(opReader.GetName(lp), opReader.GetValue(lp)); 
} 

मैं अभी भी यकीन है कि तुम क्यों एक और करने के लिए संग्रह का एक प्रकार से इस विशेष परिवर्तन की आवश्यकता होगी नहीं हूँ।

+4

अपने प्रश्न का उत्तर के रूप में: अगर एक परिणाम कैश करने के लिए की जरूरत है, यह समझदार लगता है कैश करने के लिए शब्दकोश प्रतिलिपि। अन्यथा आप खुले पाठकों के साथ समाप्त होते हैं – Toad

+1

@ टॉड वन डेटाटेबल का उपयोग कर सकते हैं यदि आप परिणाम कैश करना चाहते हैं। 'MyDataTable.Load (डॉ); ' –

+0

@CadeRoux डेटाटेबल एक एकल पंक्ति संख्या के बजाय पूरे परिणाम सेट को पढ़ेगा? –

0

GetValues ​​विधि & स्वीकार करता है, 1 डी सरणी में सभी मान डालता है।
क्या इससे मदद मिलती है?

1

यह पहले से ही IDataRecord है।

आपको एक शब्दकोश के रूप में केवल उसी पहुंच (कुंजी द्वारा) के बारे में देना चाहिए। चूंकि पंक्तियों में आमतौर पर कुछ मुट्ठी भर कॉलम नहीं होते हैं, इसलिए लुकअप का प्रदर्शन अलग नहीं होना चाहिए। एकमात्र महत्वपूर्ण अंतर "पेलोड" का प्रकार है, और यहां तक ​​कि आपके शब्दकोश को मूल्य प्रकार के लिए ऑब्जेक्ट का उपयोग करना होगा, इसलिए मैं आईडीटा रिकार्ड को किनारा देता हूं।

+6

यह तब उपयोगी होता है जब आप कनेक्शन को मुक्त करने के बाद एक क्वेरी का परिणाम उपलब्ध होना चाहते हैं। DataReader ऑब्जेक्ट्स उनके द्वारा बनाए गए कनेक्शन से आंतरिक रूप से बंधे होते हैं। – sholsinger

2

मैं 2016/03/09 पर इस सवाल में आए और SLaks द्वारा प्रदान की जवाब का उपयोग कर समाप्त हो गया। हालांकि, मैं थोड़ा के लिए इसे संशोधित करने की जरूरत:

dataRowDictionary = Enumerable.Range(0, reader.FieldCount).ToDictionary(i => reader.GetName(i), i=> reader.GetValue(i).ToString()); 

मैं इस StackOverflow सवाल से मार्गदर्शन मिला: convert dataReader to Dictionary

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