我有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对象? 谢谢!
答案 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;