2011-12-12 6 views
6

में एक्सएमएल स्टेटमेंट के लिए टीएसक्यूएल से बड़े एक्सएमएल स्ट्रिंग को पढ़ें, एक्सएमएल के साथ एक एसक्यूएल कमांड है जो एसक्लस्ट्रिंग के रूप में एक एकल एक्सएमएल लौटाता है। मेरी समस्या लंबे एक्सएमएल स्ट्रिंग को .NET C# में पढ़ रही है।सी # .NET

निम्नलिखित केवल पहले 2033 वर्ण

SqlDataReader rdr = command.ExecuteReader(); 
    if (rdr.HasRows) 
    { 
     rdr.Read(); 
     Debug.WriteLine(rdr[0].ToString().Length.ToString()); 
    } 

मैं भी command.ExecuteScalar और rdr.GetString की कोशिश की है और अभी भी केवल पहले 2033 वर्ण प्राप्त पढ़ता है। मैंने इस प्रकार को बदल दिया है और यह अभी भी 2033 में छंटनी करता है, इसलिए यह खराब चरित्र के कारण होने की संभावना नहीं है। Rdr.GetSqlXml का प्रयास किया और एक त्रुटि संदेश प्राप्त करें SqlString को SqlCachedBuffer पर नहीं डाला जा सकता है।

यदि मैं 2033 से कम चरित्र को वापस करने के लिए SQL को सीमित करता हूं तो मुझे पूर्ण मान्य XML मिलता है। तो मुझे नहीं लगता कि यह एक एक्सएमएल पार्सिंग मुद्दा है बल्कि सिर्फ एक छंटनी है। मुझे किसी भी XML पार्सिंग की आवश्यकता नहीं है - यह TSQL कथन से मान्य XML है जिसे मुझे स्ट्रिंग के रूप में चाहिए।

मैं पूर्ण XML (पाठ के रूप में) कैसे पढ़ सकता हूं?

टीएसक्यूएल काम करता है।

select top 10 docSVsys.sID, docSVsys.docID 
     , (select top 10 value + '; ' 
      from docMVtext with (nolock) where docMVtext.sID = docSVsys.sID 
       and docMVtext.fieldID = '113' 
      order by value FOR XML PATH('')) as [To] 
     from docSVsys with (nolock) 
     order by docSVsys.sID 
     for xml auto, root('documents') 

एक्सएमएल पाथ के लिए जो मुझे चाहिए और तेज़ करता है। मैंने नियमित क्वेरी की कोशिश की और फिर Xdocument का उपयोग करके एक्सएमएल उत्पन्न किया लेकिन प्रदर्शन 100 से अधिक लाइनों के साथ भयानक है क्योंकि इसे जोड़ने के लिए एसआईडी पर खोज करने की आवश्यकता है। मुझे लगता है कि मैं एक्सएमएल ऑटो से बचने के लिए एसक्यूएल फ़ंक्शन के रूप में कॉन्सटेनेशन लिख सकता हूं लेकिन फॉर एक्सएमएल के साथ यह क्वेरी तेज़ है और मुझे आवश्यक सटीक परिणाम प्रदान करता है। यह परिणाम कैसे प्राप्त करने के लिए है?

+0

क्या आप वाकई एसक्यूएल सही डेटा देता हैं लगता है? – gbn

+3

ExecuteXmlReader का उपयोग करें: http://support.microsoft.com/kb/310378 –

+0

इसके अलावा, यह अनिवार्य रूप से वही है: http://stackoverflow.com/questions/5423980/how-do-i-return-xml-from -ए-संग्रहित प्रक्रिया –

उत्तर

10

यह है एक ज्ञात समस्या, देखें: http://support.microsoft.com/kb/310378

उपयोग ExecuteXmlReader बजाय। अंतर्निहित कारण यह है कि एसक्यूएल वापस एक्सएमएल को तोड़ देता है, इसलिए आपको जवाब को अलग-अलग पढ़ने की जरूरत है। मेरे पास वीबीस्क्रिप्ट का उपयोग करके एडीओ में भी यही समस्या है।

पीएस मैं देखता हूं कि टिम ने मुझे वही जवाब दिया जब मैं अपना लिख ​​रहा था।

+3

लेकिन आप प्रतिनिधि से थोड़ा सा अधिक उपयोग कर सकते हैं! –

0

एक चयन में पूरी परिणाम रैपिंग मेरे लिए काम करने के लिए यानी .:

select (select top 10 docSVsys.sID, docSVsys.docID 
    , (select top 10 value + '; ' 
     from docMVtext with (nolock) where docMVtext.sID = docSVsys.sID 
      and docMVtext.fieldID = '113' 
     order by value FOR XML PATH('')) as [To] 
    from docSVsys with (nolock) 
    order by docSVsys.sID 
    for xml auto, root('documents')) 
+0

यह ओपी के प्रश्न पर लागू नहीं होता है। मुद्दा यह नहीं है कि एसक्यूएल ने सही एक्सएमएल वापस नहीं किया है, मुद्दा यह है कि जब आपकी एसक्यूएल क्वेरी एक बड़ी एक्सएमएल स्ट्रिंग देता है तो यह .NET ढांचे द्वारा 2033 वर्णों के अनुभागों में कटा हुआ हो जाता है। यदि आप इसे सही तरीके से नहीं पढ़ते हैं तो आपको पहले 2033 वर्णों से अधिक कभी नहीं मिलता है। – Chris