2011-12-12 14 views
6

SqlString olarak tek bir uzun XML döndüren FOR XML ile bir SQL komutuna sahip olun. Sorunum uzun XML dizesini .NET C# içine okuyor.C XML dosyasından XML deyiminden büyük XML dizesi okuyun C# .NET içinde

aşağıdaki sadece ilk 2033 karakter

Ben de command.ExecuteScalar ve rdr.GetString çalıştı ve hala sadece ilk 2033 karakter olsun var
SqlDataReader rdr = command.ExecuteReader(); 
    if (rdr.HasRows) 
    { 
     rdr.Read(); 
     Debug.WriteLine(rdr[0].ToString().Length.ToString()); 
    } 

okur. Ben türünü değiştirdim ve hala 2033'te kesiliyor, bu yüzden kötü bir karakterden kaynaklanmıyor. Rdr.GetSqlXml denedim ve SqlString SqlCachedBuffer'a bir hata iletisi alamıyor.

SQL'i 2033 karakterden daha az döndürecek şekilde sınırlandırırsam, geçerli XML'yi alırım. Bu yüzden bir XML ayrıştırma sorunu olduğunu sanmıyorum sadece bir kesme. XML ayrıştırmasına ihtiyacım yok - string olarak ihtiyacım olan TSQL ifadesinden geçerli bir XML.

Tam XML (metin olarak) nasıl okuyabilirim?

TSQL çalışır.

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') 

FOR XML PATH, ihtiyacım olanı ve hızlı olanı sağlar. Düzenli bir sorguyu denedim ve sonra Xdocument kullanarak XML'i oluşturdum ama performans, To'yu eklemek için sID üzerinde arama yapması gerektiğinden 100'den fazla hatta bile korkunç. Bence XML FORM FORMU'nu engellemek için bir SQL fonksiyonu olarak birleştirme fonksiyonu yazabilirim fakat FOR XML ile yapılan bu sorgu hızlıdır ve ihtiyacım olan tam sonuçları verir. Sonuç nasıl alınır?

+0

size SQL doğru verileri döndürür emin misin yani .: Benim için iş gibi görünüyor? – gbn

+3

Use ExecuteXmlReader: http://support.microsoft.com/kb/310378 –

+0

Ayrıca, bu esas olarak aynıdır: http://stackoverflow.com/questions/5423980/how-do-i-return-xml-from -a-saklı yordam –

cevap

10

Bu bilinen bir sorundur, bkz edilir: http://support.microsoft.com/kb/310378

Kullanım ExecuteXmlReader yerine. Bunun altında yatan sebep SQL'in döndürülen XML'i kırmasıdır, dolayısıyla cevabı farklı bir şekilde okumalısınız. Ben de VBScript kullanarak ADO aynı sorunu yaşadım.

P.S. Tim'i yazarken aynı cevabı verdiklerini görüyorum. seçkin bütün sonucun tamamlayan

+3

Ama bu temsilcisi benden biraz daha fazla kullanabilirsin! –

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

Bu OP'nin sorusu için geçerli değildir. Sorun, SQL'in doğru XML'yi döndürmemesi değil, sorun, SQL sorgunuz geniş bir XML dizgisi döndürdüğünde, .NET çerçevesi tarafından 2033 karakterlik bölümlere ayrılır. Eğer doğru şekilde okumadıysanız, ilk 2033 karakterden daha fazlasını asla elde edemezsiniz. – Chris