2011-12-12 40 views
6

Có một lệnh SQL với FOR XML trả về một XML dài là SqlString. Vấn đề của tôi là đọc chuỗi XML dài vào .NET C#.Đọc chuỗi XML lớn từ TSQL FOR XML Statement trong C# .NET

Sau đây chỉ đọc 2033 ký tự đầu tiên

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

Tôi cũng đã cố gắng command.ExecuteScalar và rdr.GetString và vẫn chỉ nhận được 2033 ký tự đầu tiên. Tôi đã thay đổi loại và nó vẫn cắt ngắn vào năm 2033 vì vậy nó không có khả năng gây ra bởi một nhân vật xấu. Đã cố gắng rdr.GetSqlXml và nhận được một thông báo lỗi không thể đúc SqlString để SqlCachedBuffer.

Nếu tôi giới hạn SQL trả về ít hơn 2033 ký tự, tôi nhận được XML hoàn chỉnh hợp lệ. Vì vậy, tôi không nghĩ rằng đó là một vấn đề phân tích cú pháp XML thay vì chỉ là một sự cắt xén. Tôi không cần bất kỳ phân tích cú pháp XML nào - đó là XML hợp lệ từ câu lệnh TSQL mà tôi cần làm chuỗi.

Làm cách nào để đọc toàn bộ XML (dưới dạng văn bản)?

TSQL hoạt động.

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 cung cấp những gì tôi cần và nhanh chóng. Tôi đã thử một truy vấn thường xuyên và sau đó tạo ra XML bằng cách sử dụng Xdocument nhưng hiệu suất là khủng khiếp với thậm chí nhiều hơn 100 dòng như nó cần phải tìm kiếm trên sID để thêm vào. Tôi đoán tôi có thể viết nối như một hàm SQL để tránh FOR XML AUTO nhưng truy vấn đó với FOR XML là nhanh và cung cấp kết quả chính xác mà tôi cần. Nó chỉ là làm thế nào để lấy kết quả?

+0

Bạn có chắc chắn SQL trả về dữ liệu có đúng không? – gbn

+3

Sử dụng ExecuteXmlReader: http://support.microsoft.com/kb/310378 –

+0

Ngoài ra, điều này về cơ bản giống như: http://stackoverflow.com/questions/5423980/how-do-i-return-xml-from -a-lưu-thủ tục –

Trả lời

10

Đây là một vấn đề được biết đến, xem: http://support.microsoft.com/kb/310378

Sử dụng ExecuteXmlReader để thay thế. Nguyên nhân cơ bản là SQL phá vỡ XML được trả về, vì vậy bạn cần phải đọc câu trả lời khác nhau. Tôi đã có cùng một vấn đề trong ADO bằng cách sử dụng VBScript quá.

P.S. Tôi thấy Tim trả lời cùng câu trả lời chính xác trong khi tôi đang viết bài của tôi.

+3

Nhưng bạn có thể sử dụng đại diện nhiều hơn một chút so với tôi! –

0

Bao bì toàn bộ kết quả trong một lựa chọn dường như làm việc cho tôi tức là .:

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

Điều này không áp dụng cho câu hỏi của OP. Vấn đề không phải là SQL không trả lại đúng XML, vấn đề là khi truy vấn SQL của bạn trả về một chuỗi XML lớn, nó sẽ được cắt nhỏ thành các phần của 2033 ký tự theo khuôn khổ .NET. Nếu bạn không đọc nó đúng cách bạn không bao giờ nhận được nhiều hơn 2033 ký tự đầu tiên. – Chris