Прочитайте [для xml auto, elements] в DataTable в ADO.NET - PullRequest
1 голос
/ 21 ноября 2010

У меня есть хранимая процедура MS SQL Server, которая возвращает XML (она использует SELECT с для xml auto, элементы )

Я попытался прочитать ее в DataTable:

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

но retTable содержит 12 строк с разделенным полным XML-кодом, возвращаемым SQL Server.

Как я могу прочитать этот XML из БД в объект DataTable?Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2016
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;
0 голосов
/ 21 декабря 2010

Что именно вы пытаетесь достичь здесь?Похоже, вы создаете поле XML в хранимой процедуре, и оно помещается в таблицу DataTable точно так же, как одно поле XML.Это ожидаемое поведение.Поэтому я думаю, что самый большой вопрос, который задают в комментариях выше, заключается в том, почему данные сначала формируются в XML, если вы хотите, чтобы они были таблицей в коде?

Одна вещь, которую вы могли бы сделать, этоиспользуйте LINQ to XML (или какой-то аналогичный подход для анализа XML DOM), чтобы запросить возвращенные результаты, чтобы получить необходимые данные из возвращенных полей.Это должно показаться довольно простым, так как вы ожидаете работать с табличными данными, и LINQ обладает этим «чувством SQL».

Однако один важный момент, который вы можете упустить в этом вопросе, - это структурное различиемежду таблицами и XML.Таблицы реляционные, XML иерархический.Они предназначены для представления данных совершенно разными способами.При этом вполне возможно, что возвращаемый XML не может быть напрямую переведен в один объект DataTable.Возможно, это не таблица данных.

...