在ADO.NET中将[for xml auto,elements]读入DataTable

时间:2010-11-21 20:20:22

标签: asp.net sql-server xml datatable readxml

我有MS SQL Server存储过程,它返回XML(它使用带有的SELECT for xml auto,elements

我尝试将其读入DataTable:

            DataTable retTable = new DataTable();
            SqlCommand comm = new SqlCommand("exec MySP", connection);
            SqlDataAdapter da = new SqlDataAdapter(comm);
            connection.Open();
            da.Fill(retTable); 

但是retTable包含12行,其中包含SQL Server返回的完整xml。

如何将DB中的XML读入DataTable对象? 谢谢!

2 个答案:

答案 0 :(得分:0)

你到底想要完成什么?这听起来就像是在存储过程中构建一个XML字段,它就像一个XML字段一样放在DataTable中。这是预期的行为。所以我想上面的评论中提到的最大的问题是,如果你想让数据成为代码中的表,为什么数据首先形成为XML?

您可以做的一件事是使用LINQ to XML(或类似的XML DOM解析方法)查询返回的结果,以便从返回的字段中获取所需的数据。它应该感觉相当简单,因为你期望使用表数据,而LINQ对它有“SQL感觉”。

然而,在这个问题中你可能缺少的一个重点是表和XML之间的结构差异。表是关系的,XML是分层的。它们旨在以完全不同的方式表示数据。话虽如此,完全有可能将返回的XML无法直接转换为单个DataTable对象。它可能不代表数据表。

答案 1 :(得分:0)

DataSet retTable = new DataSet();
SqlConnection con = new SqlConnection("data source=servername;initial catalog=databasename;uid=userid;pwd=password");
SqlCommand cmd = new SqlCommand("GetMyXmlDate", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
string xmlDoc = "";
using (XmlReader reader = cmd.ExecuteXmlReader())
{
  while (reader.Read())
  {
    xmlDoc  = xmlDoc +  reader.ReadOuterXml();
  }
}

var dataStream = new MemoryStream();
var dataWriter = new StreamWriter(dataStream);
dataWriter.Write(xmlDoc);
dataWriter.Flush();
dataStream.Position = 0;
retTable.ReadXml(dataStream);
Grid.DataSource = retTable.Tables[0].DefaultView;