2012-12-03 34 views
14

हमारे पास डेटाबेस में एक कॉलम है जिसमें xml का एक प्रकार है। मैं इस जानकारी को .net SqlDataReader के माध्यम से पढ़ रहा हूं, लेकिन मुझे यकीन नहीं है कि इसे किस पर डालना है।SQL सर्वर XML डेटाटाइप .NET में अनुवाद करता है और मैं इसे XmlDocument में कैसे परिवर्तित करूं?

MSDN तालिका (http://msdn.microsoft.com/en-us/library/cc716729.aspx) पता चलता है कि .net प्रकार Xml की है, लेकिन कोई System.Xml है, केवल System.Web.UI.WebControls.Xml तो मैं यह है कि अगर सही है यकीन नहीं है।

तो मेरे सवाल यह है:

क्या मैं के रूप में मैं इसे एक SqlDataReader से पढ़ रहा हूँ करने के लिए SqlDbType.Xml डाली करते हैं, और मैं कैसे परिवर्तित कि XmlDocument के लिए?

+0

का उपयोग कर आप SqlConnection या इकाई का उपयोग कर रहे हैं? –

+0

मैं sqlconnection – Sinaesthetic

उत्तर

5

मुझे इसे एक स्ट्रिंग में कास्टिंग याद है। एक स्ट्रिंग के साथ XmlDocument को सामान्य रूप से काम करता है।

+3

हालांकि यह काम करता है, मुझे लगता है कि इसके बजाय मूल प्रकार के साथ काम करना बेहतर है। –

+0

इस फैसले को क्या ठहराता है? किस अर्थ में बेहतर है? आसान, तेज़, ...? –

+2

वैसे यह टाइप करने के लिए सुरक्षित है अगर आप उस तरह की चीजों की परवाह करते हैं। मैं उम्मीद करता हूं कि यह तेज़ी से भी हो क्योंकि XmlReader सीधे स्ट्रीम के साथ काम कर सकता है और उसे पहले स्ट्रिंग में सबकुछ लोड नहीं करना पड़ेगा। –

0

ज़रूर, वहाँ एक System.Xml namespace है:

System.Xml नाम स्थान प्रसंस्करण एक्सएमएल के लिए मानकों पर आधारित सहायता प्रदान करता है।

इसका उपयोग करने के लिए, हालांकि, आपको शायद इसे अपने प्रोजेक्ट में संदर्भ के रूप में जोड़ना होगा। माइक्रोसॉफ्ट के पास instructions for doing this in Visual Studio है।

+2

का उपयोग कर रहा हूं उत्तर के लिए प्रासंगिक नहीं है। –

23

यह SqlXml में अनुवाद करता है और आप XmlReader से SqlXml.CreateReader प्राप्त कर सकते हैं। स्ट्रिंग के बजाय प्रकार प्राप्त करने के लिए आपको SqlDataReader.GetSqlXml विधि का उपयोग करना होगा।

उदाहरण के लिए:

 SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      SqlXml xmlData = 
      reader.GetSqlXml(0); 
      XmlReader xmlReader = xmlData.CreateReader(); 

      xmlReader.MoveToContent(); 
      while (xmlReader.Read()) 
      { 
       if (xmlReader.NodeType == XmlNodeType.Element) 
       { 
        string elementName = xmlReader.LocalName; 
        xmlReader.Read(); 
        Console.WriteLine(elementName + ": " + xmlReader.Value); 
       } 
      } 
     } 

अद्यतन: एक उपयोगी टिप्पणी @Wiktor Zychla से उत्तर देने के लिए

इस दृष्टिकोण का प्रदर्शन बेहतर है और एक बहुत हो सकता है बेहतर जब बड़े से निपटने एक्सएमएल फ़ील्ड्स क्योंकि SqlReader.GetString फील्ड सामग्री को स्ट्रिंग में पहले लोड करेगा जबकि SqlReader.GetSqlXml स्ट्रीम से सीधे XmlReader बनाता है। इसे सिस्टम पर डेटा के साथ त्वरित रूप से सत्यापित किया जा सकता है। प्रतिबिंबक में डेटा या एक समान उपकरण।

4

मैं इस विधि अपने आप का उपयोग करें, SqlCommand.ExecuteXmlReader();

XmlDocument xdoc = new XmlDocument(); 
using (SqlCommand command = new SqlCommand(queryString, connection)) 
{ 
    XmlReader reader = command.ExecuteXmlReader(); 
    if (reader.Read()) 
    { 
     xdoc.Load(reader); 
    } 
} 
+4

मुझे लगता है कि एमएसडीएन को उद्धृत करने के लिए केवल "सिंगल-पंक्ति, सिंगल-कॉलम परिणाम सेट जिसमें XML डेटा शामिल है" के लिए काम करेगा। –

+0

जैसा कि मुझे लगता है कि 'XmlDocument' वैरिएबल फ़ंक्शन लोड() के लिए ऑब्जेक्ट के रूप में 'Xmlreader' नहीं लेता है। –

+0

@ ए सीआरएम - यह अब करता है। (System.Xml.XmlReader xmlReader = xmlData.CreateReader()) { System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.Load (xmlReader); वापसी xd; } –