2012-12-03 19 views
14

Chúng tôi có một cột trong cơ sở dữ liệu có loại xml. Tôi đang đọc thông tin này qua .net SqlDataReader, nhưng tôi không chắc chắn nên truyền thông tin gì.Kiểu dữ liệu SQL Server XML dịch sang .NET là gì và làm cách nào để chuyển đổi nó thành XmlDocument?

Bảng MSDN (http://msdn.microsoft.com/en-us/library/cc716729.aspx) cho thấy đó là loại .net Xml, nhưng không có System.Xml, chỉ System.Web.UI.WebControls.Xml vì vậy tôi không chắc chắn nếu điều đó là đúng.

Vì vậy, câu hỏi của tôi là thế này:

gì tôi cast SqlDbType.Xml là tôi đang đọc nó từ một SqlDataReader, và làm thế nào để chuyển đổi đó để XmlDocument?

+0

bạn đang sử dụng SqlConnection hoặc Entity? –

+0

Tôi đang sử dụng sqlconnection – Sinaesthetic

Trả lời

5

Tôi nhớ đã truyền nó vào một chuỗi. Cho ăn XmlDocument với một chuỗi hoạt động như bình thường sau đó.

+3

Mặc dù vậy, tôi nghĩ tốt hơn nên làm việc với kiểu gốc. –

+0

Điều gì biện minh cho phán đoán này? Tốt hơn theo nghĩa nào? Dễ dàng hơn, nhanh hơn, ...? –

+2

Cũng rất an toàn nếu bạn quan tâm đến những thứ đó. Tôi hy vọng nó sẽ được nhanh hơn quá vì XmlReader có thể làm việc với các dòng trực tiếp và sẽ không nhất thiết phải tải tất cả mọi thứ vào một chuỗi đầu tiên. –

0

Chắc chắn, có một System.Xml namespace:

Không gian tên System.Xml cung cấp hỗ trợ dựa trên tiêu chuẩn để chế biến XML.

Để sử dụng, bạn có thể phải thêm nó làm tài liệu tham khảo trong dự án của mình. Microsoft có instructions for doing this in Visual Studio.

+2

Không liên quan đến câu trả lời. –

23

Nó chuyển thành SqlXml và bạn có thể nhận được XmlReader với SqlXml.CreateReader từ đó. Bạn sẽ phải sử dụng phương thức SqlDataReader.GetSqlXml để lấy loại thay vì chuỗi.

Ví dụ:

 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); 
       } 
      } 
     } 

UPDATE: Để trả lời bình luận hữu ích từ @Wiktor Zychla

Hiệu suất của phương pháp này là tốt hơn và có thể rất nhiều tốt hơn khi giao dịch với lượng lớn Trường XML vì SqlReader.GetString sẽ tải nội dung trường vào chuỗi trước khi SqlReader.GetSqlXml tạo XmlReader trực tiếp từ luồng. Điều đó có thể được xác minh nhanh chóng bằng cách xem System.Data trong Reflector hoặc một công cụ tương tự.

4

tôi sử dụng phương pháp này bản thân mình, sử dụng SqlCommand.ExecuteXmlReader();

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

Tôi nghĩ rằng sẽ chỉ làm việc cho "một tập hợp kết quả một hàng, một cột có chứa dữ liệu XML", để báo MSDN. –

+0

Khi tôi đoán biến 'XmlDocument' không lấy 'Xmlreader' làm đối tượng cho hàm Load(). –

+0

@A CRM - hiện tại. sử dụng (System.Xml.XmlReader xmlReader = xmlData.CreateReader()) { System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); xd.Load (xmlReader); trả lại xd; } –

Các vấn đề liên quan